Який ваш улюблений інструмент профілювання (для C ++) [закрито]


83

Наразі я використовував лише Rational Quantify. Я чув чудові речі про VTune від Intel, але ніколи не пробував!

Редагувати: Я здебільшого шукаю програмне забезпечення, яке буде інструментувати код, оскільки, мабуть, це єдиний спосіб отримати дуже точні результати.


Дивитися також:

Які хороші профілі для власного C ++ у Windows?


Ви хочете 1) виміряти, або хочете 2) знайти прискорення? Якщо ви хочете 2, і ви думаєте, що потрібно 1, це не зовсім так. Щоб знайти прискорення, вам не потрібні "дуже точні результати". Якщо програма витрачає 90% свого часу, роблячи те, що ви цілком могли б видалити, якби знали, що це було, зразки стека покажуть вам це 9 разів із 10. Якщо ви подивитесь на 10 зразків, тобі байдуже, чи бачиш ти це 10 разів, 9 разів або 8 разів? У будь-якому випадку, ви знаєте, що це . Виміряний відсоток не має значення.
Mike Dunlavey

Відповіді:



28

Для Linux: Google Perftools

  • Швидше, ніж валгринд (ще, не такий дрібнозернистий)
  • Не потребує кодового обладнання
  • Гарний графічний результат (-> kcachegrind)
  • Проводить профілі пам’яті, профілі процесора, перевірку витоків

9

IMHO, вибірка з використанням налагоджувача є найкращим методом. Все, що вам потрібно, це IDE або налагоджувач, що дозволяє зупинити програму. Це вражає ваші проблеми з продуктивністю ще до того, як ви навіть встановите профілі.


3
Так! Для мене це чудово працює. Він не потребує контрольно-вимірювальних приладів. Для цього не потрібен будь-який профайлер тощо. У Linux ви можете використовувати gdb. Програма працює на повній швидкості. Натисніть ctrl-c, щоб зупинити. введіть 'bt', щоб показати стек. Потім 'c', щоб продовжити, потім знову ctrl-c. Чудово працює! Просто скоротив час мого виконання на 20% у складній програмі, використовуючи цю техніку. Чудово!
Х'ю Перкінс,

@HughPerkins: Дякую за вашу редакцію, і я радий, що ви досягли успіху. (Б'юся об заклад, ви можете зробити краще, ніж 20% :)
Майк Данлавей

1
Так, я зменшив час ітерації з 1200 мс до 200 мс, за кілька годин працюю, використовуючи лише gdb + ctrl-c, щоб знайти гарячі точки :-)
Х'ю Перкінс,

@HughPerkins: Для мене, якщо я працюю над власним кодом, важко знати, коли припиняти спроби - здається, я завжди можу його ще трохи стиснути. Коли я працюю над чужим кодом, може виникнути проблема. Я не завжди можу переконати "власника" коду усунути проблему, тому процес зупиняється. Це цікава загадка.
Mike Dunlavey

Якщо ви просто хочете досягти цього без інструментарію, вам не потрібен навіть налагоджувач або IDE в Linux. Просто запустіть "pstack <pid>", щоб стек виконував поточну інструкцію трасування. Це набагато простіше, ніж запуск налагоджувача, а потім злом вручну, а потім пошук стека.
Маніш Согі

7

Мій єдиний досвід профілювання коду C ++ - це AQTime від AutomatedQA (тепер програмне забезпечення SmartBear). Він має декілька типів вбудованих профайлерів (продуктивність, пам’ять, дескриптори Windows, трасування винятків, статичний аналіз тощо) та інструментує код для отримання результатів.

Мені подобалося користуватися ним - завжди було весело знаходити ті місця, де невелика зміна коду може суттєво покращити продуктивність.


На жаль, це працює лише у Windows.
Брем

6

Я ніколи раніше не займався профілюванням. Вчора я запрограмував клас ProfilingTimer зі статичним розкладом (карта <std :: string, long long>) для зберігання часу.

Конструктор зберігає стартовий галочку, а деструктор обчислює минулий час і додає його на карту:

ProfilingTimer::ProfilingTimer(std::string name)
 : mLocalName(name)
{
 sNestedName += mLocalName;
 sNestedName += " > ";

 if(sTimetable.find(sNestedName) == sTimetable.end())
  sTimetable[sNestedName] = 0;

 mStartTick = Platform::GetTimerTicks();
}

ProfilingTimer::~ProfilingTimer()
{
 long long totalTicks = Platform::GetTimerTicks() - mStartTick;

 sTimetable[sNestedName] += totalTicks;

 sNestedName.erase(sNestedName.length() - mLocalName.length() - 3);
}

У кожну функцію (або {block}), яку я хочу створити, мені потрібно додати:

ProfilingTimer _ProfilingTimer("identifier");

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

(Хто-небудь ще працює з подібним "домашнім профілюванням"? Або це просто дурне? Але це цікаво!

Чи є якийсь спосіб автоматичного додавання рядка до всіх функцій?)


5

Раніше я широко використовував Glowcode і не мав з ним нічого, крім позитивного досвіду. Його інтеграція Visual Studio дійсно приємна, і це найефективніший / інтуїтивніший профайлер, який я коли-небудь використовував (навіть у порівнянні з профайлерами для керованого коду).

Очевидно, це марно, якщо ви не працюєте в Windows, але питання залишає незрозумілим для мене, які саме ваші вимоги.


5

опрофіль, без сумніву; його простий, надійний, робить свою роботу і може дати всілякі приємні розбивки даних.


5

Профайлер у Visual Studio 2008 дуже хороший: швидкий, зручний, зрозумілий та добре інтегрований в IDE.


2
Хіба профайлер не лише у версії Team?
dwj

@dwj: Я не впевнений. Я використовую Visual Studio Team System 2008 Development Edition.
Dimitri C.

Схоже, це лише в редакції Team ( stackoverflow.com/questions/61669/… ) для версій до 2010 р.
dwj

4

Для Windows перевірте Xperf . Він використовує вибірковий профіль, має деякий корисний інтерфейс та не вимагає контрольної роботи. Досить корисний для відстеження проблем із продуктивністю. Ви можете відповісти на такі запитання:

  • Хто використовує найбільше процесора? Розгорніть назву функції за допомогою стеків викликів.
  • Хто виділяє найбільше пам’яті?
  • Хто робить найбільше запитів реєстру?
  • Запис на диск? тощо

Ви будете здивовані, коли знайдете вузькі місця, адже вони, мабуть, не там, де ви очікували!


4

Для Windows я спробував AMD Codeanalyst, Intel VTune та профайлер у Visual Studio Team Edition.

Codeanalyst не працює (часто падає), і в моєму коді його результати часто є неточними. Його інтерфейс не інтуїтивний. Наприклад, щоб досягти відображення стека викликів у результатах профілю, потрібно перейти на вкладку "Процеси", потім натиснути на ім'я файлу EXE вашої програми, потім натиснути кнопку на панелі інструментів із крихітними літерами "CSS". Але це безкоштовна програма, тому ви можете її спробувати, і вона працює (з меншою кількістю функцій) без процесора AMD.

VTune (700 доларів) має жахливий користувальницький інтерфейс IMO; у великій програмі важко знайти конкретне дерево викликів, яке ви хочете, і ви можете одночасно переглядати лише один "вузол" у програмі (функція з безпосередніми викликами та викликами) - ви не можете переглянути повну дерево викликів. Існує подання графіка виклику, але я не міг знайти спосіб, щоб відносний час виконання відображався на графіку. Іншими словами, функції на графіку виглядають однаково, незалежно від того, скільки часу було проведено в них - це так, ніби вони повністю пропустили сенс профілювання.

Профілізатор Visual Studio має найкращий графічний інтерфейс із трьох, але з якихось причин він не може зібрати зразки з більшості мого коду (зразки збираються лише для кількох функцій у всій моїй програмі C ++). Крім того, я не міг знайти ціну або спосіб купити її безпосередньо; але він поставляється з підпискою MSDN моєї компанії. Visual Studio підтримує керований, власний та змішаний код; Я не впевнений щодо двох інших профайлерів у цьому відношенні.

На закінчення, я ще не знаю хорошого профайлера! Я обов'язково ознайомлюсь з іншими пропозиціями тут.


3

Існують різні вимоги до профілювання. Чи відповідає інструментальний код, чи вам потрібно профілізувати оптимізований код (або навіть вже скомпільований код)? Вам потрібна покрокова інформація профілю? На якій ОС ви працюєте? Вам також потрібно профілювати спільні бібліотеки? А як щодо трасування в системні виклики?

Особисто я використовую опрофіль для всього, що роблю, але це може бути не найкращим вибором у кожному випадку. Втун та Акула - відмінні.


3

Оскільки ви не згадуєте платформу, на якій працюєте, я скажу cachegrind під Linux. Безумовно. Це частина набору інструментів Valgrind.

http://valgrind.org/info/tools.html

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

Зверніть увагу, що доступний інтерфейс KCachegrind.


3

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


3

Я використовую devpartner для ПК.


Він робить інструмент коду. Він має покриття коду та перевірку обмежень (інструментована та неінструментована)
EvilTeach

2

Я спробував Quantify AQTime, і Quantify виграв через свою неоціненну функцію "зосередження на піддереві" та "видаленні піддерева".


Повна форма. Мені просто довелося зробити деякі профілі програми C ++, і це були саме ті особливості, які справді зробили мені день.
Енно

2

Єдина чутлива відповідь - PTU від Intel. Звичайно, найкраще використовувати його на процесорі Intel і отримати ще більш цінні результати, принаймні на машині C2D, оскільки самої архітектури легше повернути значущі профілі.


2

Я використовував VTune під Windows та Linux протягом багатьох років з дуже хорошими результатами. Пізніші версії погіршилися, коли вони передали цей продукт на рівень якості російської бригади розробників, а продуктивність і знизилася (збільшення аварій VTune, часто 15+ хвилин, щоб відкрити файл аналізу).

Щодо приладобудування, ви можете виявити, що воно менш корисне, ніж ви думаєте. У тих додатках, над якими я працював над додаванням контрольно-вимірювальних приладів, це часто настільки гальмує продукт, що він вже не працює (справжня історія: запустити додаток, повернутися додому, повернутися наступного дня, програма все ще ініціалізується). Крім того, за допомогою інструментального профілювання ви можете реагувати на живі проблеми. Наприклад, за допомогою віддаленого збирача дат VTune я можу запустити сеанс дискретизації проти реального сервера із сотнями одночасних з'єднань, які мають проблеми з продуктивністю, та виявляти проблеми, що трапляються у виробництві, і які я ніколи не зміг би відтворити в тестовому середовищі.



1

Мій улюблений інструмент - Easy Profiler: http://code.google.com/p/easyprofiler/

Це профайлер часу компіляції: вихідний код повинен бути вручну інструментований за допомогою набору процедур, щоб описати цільові регіони. Однак після запуску програми та вимірювання, автоматично записаної у файл XML, залишається лише відкрити програму Observer та зробити кілька кліків на інструментах аналізу / порівняння, перш ніж ви зможете побачити результат на якісній діаграмі.


1

Профайлер Visual Studio 2010 під Windows. VTune мав чудовий інструмент графіку дзвінків, але він зламався станом на Windows Vista / 7. Не знаю, чи виправили це.


0

Дозвольте мені підключити EQATEC ... саме те, що я шукав ... простий у вивченні та використанні, і дає мені інформацію, необхідну для швидкого пошуку гарячих точок. Я набагато більше люблю його, ніж вбудований у Visual Studio (хоча я ще не пробував VS 2010, щоб бути справедливим).

Можливість робити знімки ВЕЛИЧЕЗНА. Я часто отримую додатковий аналіз та оптимізацію, чекаючи запуску реального цільового аналізу ... люблю це.

Ох, і його базова версія безкоштовна!
http://www.eqatec.com/Profiler/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.