В чем разница между профилировщиками, которые нуждаются в перекомпиляции, и теми, которые этого не делают?

В чем разница между использованием профилировщиков, которым необходимо перекомпилировать исходный код с параметрами отладки (например, gprof), и профайлеров, которые не требуют перекомпиляции (например, Valgrind, OProfile,...)?


person Maryam Saeidi    schedule 14.08.2012    source источник


Ответы (3)


Я не знаком с названными профилировщиками, но есть два основных подхода к профилированию:

Инструментарий, этот метод обычно требует перекомпиляции (не всегда, например, приложения Java и .Net могут быть инструментированы динамически). С помощью этого метода можно точно измерить, как часто вызывается подпрограмма или сколько итераций делает определенный цикл.

Выборка — это метод, не требующий перекомпиляции, он просто делает снимок стека с заданными интервалами. Это оказалось эффективным способом поиска узких мест.

Дополнительную информацию о двух стратегиях можно найти здесь.

person Louis Somers    schedule 14.08.2012

По крайней мере, я могу говорить о Valgrind и gprof.

Основные различия между их использованием в основном то, что вы уже сказали. Для gprof вы должны скомпилировать его специально, чтобы включить код профилирования. Когда вы затем запускаете свой исполняемый файл, выполняется код профилирования (поскольку он встроен в вашу программу) и создается файл gmon.out, который затем может быть обработан gprof для отображения статистики времени выполнения вашей программы.

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

Еще одно важное отличие заключается в том, что Valgrind может сообщать гораздо больше информации, чем gprof, но это не имеет прямого отношения к его использованию.

person Telgin    schedule 14.08.2012

Любому методу профилирования потребуется информация таблицы символов, поэтому ее необходимо запрашивать при компиляции и компоновке.

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

Другим профилировщикам этого делать не нужно, вместо этого они полагаются на периодические выборки стека вызовов. Такой профилировщик имеет меньшие накладные расходы. Его временные данные неточны из-за статистического характера выборки.

Подразумевается, что для обнаружения «узких мест» необходима точность времени, что, насколько мне известно, никогда не подтверждалось. метод, который я всегда использовал для ускорения на несколько порядков, основан на понимании того, что программа делает так, как тратит время, а не на то, сколько именно времени тратится. Если вас интересует статистическое обоснование, вы можете посмотреть здесь.

person Mike Dunlavey    schedule 14.08.2012