Що таке хороший простий у використанні профайлер для C ++ в Linux? [зачинено]


79

Мені потрібно профайлювати код, що працює на C ++ в Linux. Чи можете ви, хлопці, порекомендувати кілька профайлерів?


1
Слід додати теги Linux і C ++. Ви, мабуть, отримаєте кращу реакцію та коло думок.
Качка


наприклад: likwid, LLTng, oprofile, valgrind, vtune, gprof, perf, gperftools, pTop
Шань,

Подивіться це питання на наклон
ideaman42

Відповіді:


37

Використовуйте gprof.

Просто скомпілюйте з -pgпрапором (я думаю (але я не впевнений), вам доведеться перейти на оптимізацію.) І використовуйте gprof для аналізу файлу gmon.out, який потім створить ваш виконуваний файл.

наприклад:

gcc -pg -o whatever whatever.c

./whatever

gprof whatever gmon.out

Те саме з g ++ та cpp.


32
Профілювати неоптимізований код трохи безглуздо, чи не так? Подібним чином, код профілювання, сильно змінений за допомогою -pg, часто вводить вас в оптимізацію неправильних місць.
федеральний

1
-pg - варіант компонування, а не компілятор
Slug Pue

24

valgrind - це добре відомий профайлер Linux


думав, що valgrind - це більше для перевірки витоків пам’яті .. Я намагаюся зрозуміти, які функції викликаються тощо
shergill

14
скористайтеся інструментом набору під назвою "callgrind"
dfa

2
Valgrind - це просто основа для побудови динамічних інструментів. Хоча це стало синонімом Memcheck, інструменту, побудованого на Valgrind. Callgrind досить добре володіє профіліром.
Falaina


13

Масштабування від RotateRight ( http://www.rotateright.com ) - це те, чим я користувався. Він має метеликовий перегляд функцій, і ви можете двічі клацнути будь-яку функцію, щоб зануритися у вихідний код або код asm. Побудуйте з інформацією про налагодження (-g), щоб побачити своє джерело, але ви все одно повинні будувати та профілювати оптимізований код.


1
Просто дав цій програмі постріл, це справді дуже приємно! В даний час мій улюблений профайлер на Linux; однак варто зазначити, що -fno-omit-frame-pointerдля ефективного профілю він вимагає побудови коду .
Нік Рейман,

1
Посилання здається мертвим. Хтось знає, де (або якщо) його можна знайти деінде?
Simon F,

12

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

Vtune - ще один дуже потужний профайлер, виготовлений Intel. Я вважаю, що версія Linux є безкоштовною для некомерційного програмного забезпечення.

Існує також набір інструментів Valgrind, запропонований dfa. Callgrind, мабуть, буде тим, що вас найбільше цікавить. Cachegrind (набір функцій якого є підмножиною Callgrind) та Massif також цікаві, але у мене немає досвіду з останнім.


+1 для опрофіль, що не є "простим інструментом"
dfa

1
Ха-ха, правда. Мені, мабуть, не слід робити такий звук настільки простим :) Це, звичайно, не так просто, як "запустити програму під ним", як інструменти Vtune та Valgrind, але я відчуваю, що ти звикнеш до цього досить швидко.
Falaina

oprofile виглядає цікаво - чи підтримує він x86_64?
LiraNuna

На жаль, VTune не є безкоштовним для будь-якого використання.
rustyx



2

gprof - це стандартний інструмент gnu для профілювання.


2

Погляньте на Sysprof . Швидше за все, його розповсюдження вже доступне.

Зауважте, що всі згадані профілі працюють найкраще, якщо ваша програма скомпільована з вказівниками на фрейми. Тобто ви повинні використовувати -fno-omit-frame-pointer у командному рядку gcc.


1

Ви просто базуватимете своє судження щодо вузького місця на 10 зразках, які ви збираєте вручну, замість 1000 зразків, зібраних prof.
Дмитро Григор’єв

1
@DmitryGrigoryev: Правильно, і це насправді говорить вам, що ви повинні виправити. Статистичне пояснення тут . Насправді, перша помилка людей - це думка, що вони шукають "вузьке місце", а не цілком хороший, але марнотратний код ;-)
Майк Данлвей

Приємно читати, дякую. Я повністю розумію, що оптимізація набагато простіша, коли ви бачите фактичний виклик функції в налагоджувачі. І я розумію, що «вузьке місце» не означає «хороша ціль оптимізації», а лише потенційне. Тим не менш, я вважаю, що в profбудь-якому випадку має сенс розпочати : якщо я бачу, що f()це найбільш проблематична функція статистично, я зупиняю програму кілька разів, поки не приземлюсь, f()замість того, щоб просто починати з випадкової функції, в якій я зупинився першим.
Дмитро Григор’єв
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.