Мені потрібно профайлювати код, що працює на C ++ в Linux. Чи можете ви, хлопці, порекомендувати кілька профайлерів?
Мені потрібно профайлювати код, що працює на C ++ в Linux. Чи можете ви, хлопці, порекомендувати кілька профайлерів?
Відповіді:
Використовуйте gprof.
Просто скомпілюйте з -pg
прапором (я думаю (але я не впевнений), вам доведеться перейти на оптимізацію.) І використовуйте gprof для аналізу файлу gmon.out, який потім створить ваш виконуваний файл.
наприклад:
gcc -pg -o whatever whatever.c
./whatever
gprof whatever gmon.out
Те саме з g ++ та cpp.
valgrind - це добре відомий профайлер Linux
Масштабування від RotateRight ( http://www.rotateright.com ) - це те, чим я користувався. Він має метеликовий перегляд функцій, і ви можете двічі клацнути будь-яку функцію, щоб зануритися у вихідний код або код asm. Побудуйте з інформацією про налагодження (-g), щоб побачити своє джерело, але ви все одно повинні будувати та профілювати оптимізований код.
-fno-omit-frame-pointer
для ефективного профілю він вимагає побудови коду .
Я фанат Oprofile . Він передбачає встановлення модуля ядра і має трохи кривої навчання, але він досить потужний і дуже добре працює для оптимізованих програм / програм без налагодження символів.
Vtune - ще один дуже потужний профайлер, виготовлений Intel. Я вважаю, що версія Linux є безкоштовною для некомерційного програмного забезпечення.
Існує також набір інструментів Valgrind, запропонований dfa. Callgrind, мабуть, буде тим, що вас найбільше цікавить. Cachegrind (набір функцій якого є підмножиною Callgrind) та Massif також цікаві, але у мене немає досвіду з останнім.
Погляньте на KCacheGrind, який є графічним інтерфейсом до valgrind і робить його дуже простим у використанні.
У Google також є хороший профайлер як частина google-perftools - які входять до складу Debian / Ubuntu та, можливо, інших дистрибутивів.
Погляньте на Sysprof . Швидше за все, його розповсюдження вже доступне.
Зауважте, що всі згадані профілі працюють найкраще, якщо ваша програма скомпільована з вказівниками на фрейми. Тобто ви повинні використовувати -fno-omit-frame-pointer у командному рядку gcc.
prof
.
prof
будь-якому випадку має сенс розпочати : якщо я бачу, що f()
це найбільш проблематична функція статистично, я зупиняю програму кілька разів, поки не приземлюсь, f()
замість того, щоб просто починати з випадкової функції, в якій я зупинився першим.