2009-05-13 2 views
13

Я пытаюсь найти профилировщики с открытым исходным кодом, а не использовать один из коммерческих профилировщиков, за который я должен заплатить $$$. Когда я выполнил поиск по SourceForge, я пришел через эти четыре профайлеров C++, что я думал, были весьма многообещающими:Рекомендуемые профилировщики с открытым исходным кодом

  1. Shiny: C++ Profiler
  2. Обезжиренный Profiler
  3. Люк Stackwalker
  4. FreeProfiler

Я не уверен, какой из профилографов был бы лучшим, чтобы использовать его с точки зрения изучения производительности моей программы. Было бы здорово услышать некоторые предложения.

+0

Какая платформа? Я использую gprof, когда я работаю с g ++ в Linux. –

+0

Моя программа работает под управлением Windows XP. – stanigator

ответ

6

Вы можете попробовать Windows Performance Toolkit. Полностью свободен в использовании. В этом blog entry приведен пример того, как выполнять профилирование на основе пробы.

+0

Я просто просмотрел его, но я узнал, что мне нужно использовать Windows Vista или Server 2008 на моем компьютере, чтобы иметь возможность его установить. Поскольку я не хочу устанавливать Windows Vista на ноутбук, который я использую для разработки, на котором работает XP, я не думаю, что могу лично пойти с этим вариантом. Спасибо за предложение в любом случае. – stanigator

+0

Мне очень понравился Very Sleepy или даже Luke Stackwolker. xPerf звучит неплохо в теории, но на практике это очень неудобно использовать - трудно получить работу, медленно обрабатывая данные сбора. – Suma

0

Мы используем LtProf и были довольны этим. Не с открытым исходным кодом, но только $$, а не $$$ :-)

3

Там больше, чем один из способов сделать Это.

Don't forget the no-profiler method.

Большинство профайлеры предположим вам нужно 1) высокую статистическую точность времени (много образцов), и 2) низкая точность идентификации проблемы (функции & вызова-графики).

Эти приоритеты могут быть отменены. То есть проблема может быть установлена ​​на точный адрес машины, тогда как предел стоимости является функцией количества выборок.

Большинство реальных проблем стоят не менее 10%, где высокая точность не является существенной.

Пример: Если что-то делает вашу программу занятой в 2 раза дольше, это значит, что в ней есть код, который стоит 50%. Если вы берете 10 выборок стека вызовов, пока он медленный, то точные строки кода будут присутствовать примерно на 5 из них. Чем больше программа, тем более вероятной проблемой является вызов функции где-то в середине стека.

Это противоречит интуиции, я знаю.

ПРИМЕЧАНИЕ: xПерф находится почти там, но не совсем (насколько я могу судить). Он берет образцы стека вызовов и сохраняет их - это хорошо. Вот что я думаю, что это необходимо:

  • Он должен брать только образцы, когда вы хотите их. Как бы то ни было, вы должны отфильтровать ненужные.

  • В представлении стека он должен показывать определенные строки или адреса, по которым происходят вызовы, а не только целые функции. (Может быть, он может это сделать, я не мог сказать из блога.)

  • Если вы нажмете, чтобы получить представление о бабочке, ориентированное на одну команду вызова или инструкцию листа, оно должно показать вам не долю ЦП, а долю выборок стека, содержащих эту инструкцию. Это будет прямая мера стоимости этой инструкции, как часть времени. (Может быть, он может это сделать, я не могу сказать.) Так, например, даже если инструкция была вызовом открытия файла или чего-то еще, что простаивает поток, он по-прежнему стоит настенное время, и вам нужно знайте это.

ПРИМЕЧАНИЕ: Я просто посмотрел на Люка Стаквокера, и те же замечания применяются. Я думаю, что это на правильном пути, но требует работы пользовательского интерфейса.

ADDED: Осмотрев LukeStackwalker более тщательно, я боюсь, что он стал жертвой предположения, что измерительные функции важнее, чем определение местоположения. Таким образом, на каждом образце стека вызовов он обновляет информацию о времени на уровне функции, но все, что она делает с информацией о номере линии, отслеживает минимальные и максимальные номера строк в каждой функции, что, чем больше образцов требуется, чем дальше. Таким образом, это в основном отбрасывает самую важную информацию - информацию о номере линии. Важной причиной является то, что если вы решите оптимизировать функцию, вам нужно знать, какие строки в ней нуждаются в работе, и эти строки были в образцах стека (до того, как они были отброшены).

Можно было бы возразить, что если информация о номере линии была сохранена, это быстро закончило бы хранение. Два ответа. 1) Есть только так много строк, которые появляются на образцах, и они появляются неоднократно. 2) Не так много образцов необходимо - предположение о необходимости высокой статистической точности измерения всегда принималось, но никогда не было оправдано.

Я подозреваю, что другие сэмплеры стека, такие как xPerf, имеют схожие проблемы.

2

Это не открытый источник, но AMD CodeAnalyst является бесплатным. Он также работает на процессорах Intel, несмотря на название. Существуют версии для Windows (с интеграцией Visual Studio) и Linux.

2

От тех, кто внес свой вклад в список, я нашел, что Люк Стэквакер работает лучше всего - мне понравился его графический интерфейс, было легко работать.

Другое подобное - Very Sleepy - аналогичная функциональность, выборка кажется более надежной, GUI, возможно, немного сложнее в использовании (не в том графическом).

Проведя еще некоторое время с ними, я нашел один довольно важный недостаток. В то время как оба пытаются выполнить выборку с разрешением 1 мс, на практике они не достигают этого, потому что их метод выборки (StackWalk64 вложенного процесса) является слишком медленным. Для моего приложения требуется около 5-20 мс, чтобы получить стоп-вызов. Это не только делает ваши результаты неточными, но и делает их искаженными, поскольку короткие призывы идут быстрее, поэтому, как правило, получают больше обращений.

+0

Привет, Сума.IMO приблизительный процент от общего времени, используемого каждой строкой кода (или функции, если хотите), более важно знать, чем точное абсолютное время, а процент времени не должен зависеть от издержек выборки или частоты выборки. –

+0

Основная проблема заключается в том, что «короткие звонки идут быстрее». Это делает частоту дискретизации выборки в зависимости от глубины стека вызовов при попытке сэмплирования на 1 мс, что определенно плохо. Выборка в 20 мс была бы возможна, но это слишком грубо для меня. Я реализовал другой метод выборки в производной версии (нигде не публикуется), где приложение самостоятельно обрабатывает свои вызовы и отправляет результаты в профайлер Sleepy через именованный канал. Таким образом, выборка примерно на 1000 раз быстрее (1-5 us), что делает выборку 1 мс очень хорошей. – Suma

+0

Естественно предположить, что вы должны как можно быстрее взять как можно больше образцов (для точности оценки времени), но если какая-либо активность занимает 10% времени, она будет отображаться примерно на 10% образцов, независимо от того, возьмите 20 образцов или 20 000, * при условии, что образцы произойдут в непредсказуемые моменты времени * в отношении того, что делает программа. Так что вам не составит труда найти его, он выскочит на вас. http://stackoverflow.com/questions/406760/whats-your-most-controversial-programming-opinion/1562802#1562802 –

Смежные вопросы