Valgrind. Профілювання програмного забезпечення

Профілювання програм може здійснюватися за допомогою двох модулів — callgrind та cachegrind. Кожен з них збирає різну інформацію. При цьому не можна покладатися на результати роботи лише одного з модулів, краще проводити пошук «вузьких» місць у програмах на основі аналізу виводу кожного з модулів.

cachegrind

Модуль cachegrind проводить збір статистики по потраплянню до кешу процесора першого та другого рівнів при виконанні операцій читання і запису даних та інструкцій програм, а також статистику по роботі модуля передбачення галуження у програмах. За замовчуванням, збір статистики по пророкуванню галуження інструкцій (branch prediction) не проводиться, і якщо ви хочете отримати ці дані, то повинні скористатись опцією --branch-sim зі значенням yes. Крім цього, користувач має можливість зазначення додаткових опцій, наприклад, задати розміри кешів, тощо.

Результати зібрані даними модулем, за замовчуванням, виводяться у файл з іменем cachegrind.out. (Pid — ідентифікатор процесу). Якщо ви хочете використовувати інше ім'я файлу, то можете скористатися опцією --cachegrind-out-file.

Використання cachegrind

Якщо ви запускаєте свою програму, як:

# myprog arg1 arg2

Використайте наступну команду:

# valgrind --tool=cachegrind myprog arg1 arg2

По завершенню програми, valgrind таблицю з сумарними даними, зібраними під час виконання програми:

I refs: 1,873,023
I1 misses: 2,222
L2i misses: 2,057
I1 miss rate: 0.11%
L2i miss rate: 0.10%

D refs: 808,914 (578,685 rd + 230,229 wr)
D1 misses: 9,785 ( 9,212 rd + 573 wr)
L2d misses: 5,119 ( 4,757 rd + 362 wr)
D1 miss rate: 1.2% ( 1.5% + 0.2% )
L2d miss rate: 0.6% ( 0.8% + 0.1% )

L2 refs: 12,007 ( 11,434 rd + 573 wr)
L2 misses: 7,176 ( 6,814 rd + 362 wr)
L2 miss rate: 0.2% ( 0.2% + 0.1% )

в якій перераховані дані по вибірці інструкцій і даних процесором. А до файлу cachegrind.out (досить великий, навіть для дуже простих програм) потраплять детальні дані, які можна використовувати для пошуку «вузьких» місць у програмах. Зручним засобом аналізу є програма kcachegrind, але й у дистрибутиві valgrind є програма cg_annotate, яка дозволяє проводити аналіз продуктивності программ.

Для отримання даних, в якості параметрів програми cg_annotate вказують ім'я файлу з результатами, зібраними cachegrind, а також (опціонально) перелік файлів з джерельними текстами, які будуть анотовані за результатами роботи cg_annotate. Щоб не вказувати усі файли з джерельними текстами вручну, cg_annotate приймає опцію --auto зі значенням yes, і автоматично шукає потрібні файли (за допомогою опції -I можна вказати каталоги, в яких повинен здійснюватися пошук файлів).

cg_annotate виводить на екран анотовані джерельні тексти, в яких для кожної функції (і рядка коду, в залежності від опцій) вказується кількість операцій читання або запису, а також інша статистика по роботі програми. Використовуючи цю інформацію, розробник отримує можливість оптимізувати місця, які найбільш сильно впливають на роботу програми.

callgrind

Даний модуль дозволяє зібрати інформацію про дерево виклику функцій у програмі. За замовчуванням, він збирає дані про кількість виконаних інструкцій, залежності між викликаної і тієї, що її викликає функціями, а тако та кількість викликів конкретних функцій. Крім того, можна включити емуляцію кешей, аналогічну cachegrind, що дозволить зібрати дані про доступ до пам'яті.

Дані зібрані модулем виводяться у файл callgrind.out. pid, який потім може бути проаналізовано за допомогою програм kcachegrind або callgrind_annotate (входить до дистрибутиву valgrind).

callgrind_annotate виводить на екран дані про виконання різних функцій, і може представляти їх в різному вигляді, в залежності від зазначених параметрів. Також, як і для cg_annotate, можна вказати опцію --auto, щоб уникнути необхідності вказання файлів з джерельними текстами вручну.

За замовчуванням, callgrind виводить інформацію один раз, у кінці виконання програми. Але користувачі, яким це потрібно, можуть використовувати програму callgrind_control з дистрибутиву valgrind для отримання проміжних даних за запитом, або ж періодично.

Використані матеріали

Что такое valgrind и зачем он нужен

Коментарі 2

whirlwind - 14 серпня 2009, 16:36

кстати, не пробовали valgrind'ом проверять на утечки Qt-шные приложения?

sashko - 14 серпня 2009, 17:51

Пробував.

Коментувати
© 2009 - 2018, Розробка - соціальна ІТ спільнота.
Контакти: info@rozrobka.com
Правила користування