Рекомендации для 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. Это особенно интересно, если вы хотите сравнить ядро.