Zaczniemy do przykładu, którym ma zając się valgrind.
#include <iostream>
#include <vector>
using namespace std;
template <typename T>
T * alloc()
{
cout << "size " << sizeof(T) << endl;
return new T[1000000];
}
void alloc_dealloc()
{
int * a = alloc<int>();
delete [] a;
}
int main()
{
alloc_dealloc();
vector<char> v(100000);
alloc<long long>();
alloc_dealloc();
for (int i = 0; i < 300; ++i)
alloc_dealloc();
return 0;
}
Taki projekt trzeba skompilować, generując informacja dla debuggera.$ g++ -g main.cppTeraz nasz program można poddać analizie
$ valgrind --tool=massif --time-unit=B --stacks=yes --massif-out-file=mem.out ./a.out $ ms_print mem.out* pierwsza linijka włącza massif do analizy (--tool=massif),
* "jednostka czasu" używana przez profiler - nie jestem pewny jak to rozumieć.
The time unit used for the profiling. There are three possibilities: instructions executed (i), which is good for most cases; real (wallclock) time (ms, i.e. milliseconds), which is sometimes useful; and bytes allocated/deallocated on the heap and/or stack (B), which is useful for very short-run programs, and for testing purposes, because it is the most reproducible across different machines.W każdym razie, jest zalecana do małych programów i w celach testowych, więc to czego szukam.
* informuje, że interesuje nas też pamięć, która zostanie zaalokowana na stosie (--stack=yes),
* jak będzie nazywał się surowy plik z analizą zużycia pamięci (--massif-out-file=mem.out),
Massif rozdziela proces zbierania danych od ich prezentacji, w ten sposób w przyszłości mogą pojawić się nowe metody na ich prezentowanie. Plik, gdzie zostały zgromadzone dane poddajemy działaniu ms_print.
Number of snapshots: 72 Detailed snapshots: [1 (peak), 8, 27, 32, 37, 42, 47, 55, 65] -------------------------------------------------------------------------------- n time(B) total(B) useful-heap(B) extra-heap(B) stacks(B) -------------------------------------------------------------------------------- 0 0 0 0 0 0 1 21,983,976 12,103,920 12,100,000 3,576 344Mnie interesują najbardziej dwie linijki z całego raportu. Pierwsza to numer snapshota, który zanotował największy "peak" (1). A druga do dokładne informacje z tego snapshota, czyli całkowite zużycie pamięci, w tym przypadku 12103920 bajtów.
Brak komentarzy:
Prześlij komentarz