Dobrymi narzędziami do profilowania aplikacji c++ są: Valgrind i KCachegrind
Komenda valgrind niezbędna do wyciągnięcia danych to:
valgrind --tool=callgrind ./APP
Do tego możemy dorzucić logowanie wykonywanych instrukcji na procesorze:
valgrind --tool=callgrind --dump-instr=yes ./APP
Jak już wiemy jak uruchomić analizowanie wydajności możemy przejść do odpalenia testu. Ja osobiście lubię wykonywać profilowanie na benchmarkach i tak oto moja magiczna komenda meson do odpalenia benchmark wraz z analizą aplikacji:
meson test --benchmark -v --wrap='valgrind --tool=callgrind --dump-instr=yes'
w rezultacie dostajemy plik (callgrind.out.PID):
callgrind.out.5324
Teraz już pozostaje nam uruchomienie KCachegrind i załadowanie naszego pliku out z wynikiem działania valgrind
Poniżej lista najbardziej kosztownych metod, poza metodami benchmarka widać naszą metodę: BM_SlowOper. Jest to bardzo prymitywna metoda, bo wykonuje milion razy kopiowanie stringa, ale w ten sposób chciałem pokazać jak można wyłapać najwolniejszą metodę. Oczywiście w życiu codziennym nie jest to tak łatwe i oczywiste.
Wracając do naszej metody, widać, że wykonała się raz i zajęła 16% całości czasu wykonania benchmarka
Poniżej mamy wywołania wewnątrz naszej metody, tutaj widać, że 62% to jest wywołanie menadżera pamięci po to żeby skopiował nam stringa
Możemy również zobaczyć koszty wywołań w postaci grafu:
Poniżej mamy bardziej realne wywołania, czyli sprofilowany blog:
Tu widać, że metoda wyszukująca wyniki po tagach jest najdroższa, choć wynika to raczej z tego, że na każde żądanie wejścia na stronę jest najwięcej wywołań tej metody. Poniżej widać że najdroższe dla tej metody jest zbudowanie z obiektu PostRow obiektu rapidjson a potem sortowanie, niestety KCachegrind nie pokazuje czasu operacji.
Do tego możemy sobie posortować po bibliotece jaka została wykorzystana i w ilu procentach co też może nam pomóc zweryfikować nasz kod:
Możemy jeszcze posortować sobie po wywołanej klasie:
Powyżej widać, że najdroższe w całej aplikacji jest budowanie JSON.