Рекомендации для C Profilers?
Каждый всегда говорит, чтобы профилировать вашу программу перед выполнением оптимизации, но никто никогда не описывает, как это сделать.
Каковы ваши методы для профилирования кода C?
Ответы
Ответ 1
Используя gcc
, я скомпилирую и свяжусь с -pg
(как описано, например здесь), затем продолжайте, запустив программу (согласно к принципам, также предложенным в этом URL-адресе) и используя gprof
. Инструменты будут отличаться, если вы используете разные компиляторы & c, но URL-адрес по-прежнему рекомендуется, даже тогда, для частей, которые касаются общих идей о том, как и почему профиль вашего кода.
Ответ 2
Если вы используете Linux, я рекомендую комбинацию ValGrind и CallGrind и KCacheGrind. ValGrind - превосходный способ обнаружения утечек памяти, а расширение CallGrind делает хороший профилировщик.
ПРИМЕЧАНИЕ. Я просто узнал, что ValGrind теперь также работает на Mac OSX. Тем не менее, CallGrind и KCacheGrind не обновлялись с 2005 года. Возможно, вам стоит взглянуть на другие интерфейсы.
Ответ 3
Рад, что вы спросили:-) Если вы не против противоположного, проверьте эти ответы:
Позвольте мне попробовать кратко:
-
Ожидает ли вас программа, или вы ее ждете? Если это вас не заставит ждать, то у вас нет проблем, поэтому оставьте его в покое.
-
Если это заставляет вас ждать, то продолжайте.
Я рекомендую выборку, которая получает стробоскопические рентгенограммы того, что делает программа, когда она занята (не дожидаясь вас). Получите образцы как минимум из стека вызовов, а не только счетчика программ. Если вы получаете только образцы счетчика программ, это будет бессмысленным, если ваша программа тратит значительное время на ввод-вывод или в библиотечные процедуры, поэтому не соглашайтесь на это.
Если вы хотите получить много образцов, вам нужен профилировщик. Если вам нужно только несколько, кнопка паузы в отладчике работает нормально. По моему опыту, 20 более чем достаточно, и часто бывает 5.
Почему? Предположим, у вас есть 1000 образцов стека вызовов. Каждый образец представляет собой ленту времени настенных часов, которая расходуется только потому, что запрашивала ее всякая строка кода в стеке. Итак, если есть строка кода, которая появляется на 557 образцах из 1000, вы можете предположить, что она отвечает за 557/1000 времени, дайте или возьмите несколько образцов (15). Это означает, что если бы все время выполнения стоило вам 100 долларов, эта линия сама по себе стоила бы $55,70, дайте или возьмите $1,50 **, поэтому вам стоит посмотреть, действительно ли вам это нужно.
Но вам нужно 1000 образцов? Если эта линия стоит около 55,7% времени, то если вы взяли всего 10 образцов, вы увидите их на 6 из них, отдадите или возьмите 1,5 образца. Поэтому, если вы видите выражение на 6 из 10 образцов, вы знаете, что он стоит вам примерно от 45 до 75 долларов США из 100 долларов США. Даже если это будет стоить всего лишь $45, разве вы не хотите увидеть, действительно ли вам это нужно?
Вот почему вам не нужно много образцов - вам не нужна большая точность. То, что вам нужно, это то, что вам дают образцы стека - они точно указывают на наиболее ценные линии для оптимизации.
** Стандартное отклонение количества выборок sqrt( f * (1-f) * nsamp )
, где f
- это доля выборок, содержащих строку.
Ответ 4
Shark/Instruments (используя dtrace) - это профилировщики, доступные на Mac. Они очень хороши.
Ответ 5
Для завершения я добавлю oprofile. Это особенно интересно, если вы хотите сравнить ядро.
Ответ 6
Visual Team Team System поставляется с хорошим профилировщиком.
Кроме того, Intel VTune неплохо.