Каждый всегда говорит, чтобы профилировать вашу программу перед выполнением оптимизации, но никто никогда не описывает, как это сделать.
Каковы ваши методы для профилирования кода C?
Каждый всегда говорит, чтобы профилировать вашу программу перед выполнением оптимизации, но никто никогда не описывает, как это сделать.
Каковы ваши методы для профилирования кода C?
Используя gcc
, я скомпилирую и свяжусь с -pg
(как описано, например здесь), затем продолжайте, запустив программу (согласно к принципам, также предложенным в этом URL-адресе) и используя gprof
. Инструменты будут отличаться, если вы используете разные компиляторы & c, но URL-адрес по-прежнему рекомендуется, даже тогда, для частей, которые касаются общих идей о том, как и почему профиль вашего кода.
Если вы используете Linux, я рекомендую комбинацию ValGrind и CallGrind и KCacheGrind. ValGrind - превосходный способ обнаружения утечек памяти, а расширение CallGrind делает хороший профилировщик.
ПРИМЕЧАНИЕ. Я просто узнал, что ValGrind теперь также работает на Mac OSX. Тем не менее, CallGrind и KCacheGrind не обновлялись с 2005 года. Возможно, вам стоит взглянуть на другие интерфейсы.
Рад, что вы спросили:-) Если вы не против противоположного, проверьте эти ответы:
Позвольте мне попробовать кратко:
Ожидает ли вас программа, или вы ее ждете? Если это вас не заставит ждать, то у вас нет проблем, поэтому оставьте его в покое.
Если это заставляет вас ждать, то продолжайте.
Я рекомендую выборку, которая получает стробоскопические рентгенограммы того, что делает программа, когда она занята (не дожидаясь вас). Получите образцы как минимум из стека вызовов, а не только счетчика программ. Если вы получаете только образцы счетчика программ, это будет бессмысленным, если ваша программа тратит значительное время на ввод-вывод или в библиотечные процедуры, поэтому не соглашайтесь на это.
Если вы хотите получить много образцов, вам нужен профилировщик. Если вам нужно только несколько, кнопка паузы в отладчике работает нормально. По моему опыту, 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
- это доля выборок, содержащих строку.
Shark/Instruments (используя dtrace) - это профилировщики, доступные на Mac. Они очень хороши.
Для завершения я добавлю oprofile. Это особенно интересно, если вы хотите сравнить ядро.
Visual Team Team System поставляется с хорошим профилировщиком. Кроме того, Intel VTune неплохо.