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