Avatar billede kmunk Nybegynder
28. april 2000 - 15:55 Der er 4 kommentarer og
1 løsning

Få hukommelsesforbruget af et program/funktion i runtime ...

Hvordan kan jeg få oplysninger om programmets hukommelsesforbrug i runtime.
Her tænker jeg på en evt. funktion, der kan kaldes flere gange i programmet som tager det aktuelle hukommelsesforbrug og smider ind i et array, hvor efter vi kan udskrive peaket.
Avatar billede roadkill Nybegynder
28. april 2000 - 17:50 #1
Du skal simpelthen overloade operator new, new[], delete og delete[] med funktioner, der

1) Opdaterer en liste over alle allokerede blokke
2) malloc'er eller free'er den hukommelse, som den originale operator ville have gjort

Fx: (antal, at insert indsætter en adresse (som key) og en størrelse (som value) i en eller anden form for tabel (et stl map kan anbefales) og at remove fjerner den indgang, som har den givne adresse som key og returnerer value'n

long max_use=0,use=0;
void *operator new(size_t _mem)
{
  void *ptr=malloc(_mem);
  insert(ptr,_mem);
  use+=_mem;
  if (use>max_use)
    max_use=use;
  return ptr;
}

void operator delete(void *_ptr)
{
  use-=remove(_ptr);
  delete _ptr;
}

Bemærk dog, at der er een fare ved dette: Da den tabel, du skal benytte til at lave denne statistik, også allokeres vha new og new[], så vil dine overloadede rutiner (som tilgår tabellen) blive kaldt, mens tabellen bliver lavet - dette er ikke godt! Men det kan forhindres ved at have en statisk variabel, som man sætter lig 0 i deklarationen og som man sætter lig 1 som det første i main(). Så skal man bare udvide de overloadede operatorer til at nøjes med at allokere/deallokere, hvis variablen er 0 og kun tilgå tabellen, når variablen er 1.

Det lyder måske lidt indviklet, men det er faktisk ret nemt at lave. Hvis du kan vente til mandag, kan jeg sagtens sende dig et kodeeksempel fra mit arbejde (jeg har nemlig haft samme behov på et tidspunkt)
Avatar billede roadkill Nybegynder
28. april 2000 - 17:52 #2
Bemærk venligst, at dette KUN virker, hvis du altid delete'r præcis de pointere, du har allokeret. Du må ikke, fx, gøre sådan her:

char *a=new char[500];
char *b=a+50;
delete[] b;

da de overloadede funktioner sammenligner pointere for at lave statistikken
Avatar billede kmunk Nybegynder
02. maj 2000 - 11:01 #3
Tak for dit svar ... jeg har forsøgt at køre det, og det fungerer helt fint, men det er ikke kun det vi skal bruge, vi skal også ind og se, hvor mange resourcer, som programmet selv bruger på at køre, ud over den hukommelse, der bliver allokeret af programmet.
Avatar billede roadkill Nybegynder
02. maj 2000 - 12:18 #4
Hvad mener du med resourcer udover memory? filhandlere osv.?
Avatar billede kmunk Nybegynder
09. maj 2000 - 12:31 #5
Undskyld, at jeg svarer så sent, det jeg mener, er ikke hvor meget hukommelse, jeg allokerer til de forskellige objekter og variabler, men hvor meget der også bliver brugt af programmet ... jeg opretter en int, så allokere jeg 4 bytes og hvis jeg har en char ... så ligger jeg bare de to forbrug sammen, men hvis jeg nu vil have at vide, hvor stor et hukommelsesforbrug har mens det kører, udover den hukommelse som bliver allokeret i de forskellige variabler og objekter ... er det totalt sort, det jeg spørger om ... eller giver det bare den mindste smule mening ???
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester