2010-05-24 2 views
5

Означает ли какой-либо орган профайлер кода C, например gprof, который дает время вызова функции в микросекундах вместо миллисекунд?микросекундный профилировщик для кода C

+0

И мне нужно, чтобы он работал на ubuntu и был бесплатным. – godot101

+0

Вы спрашиваете, хотите ли вы узнать, что вы можете изменить, чтобы сократить время? –

+0

@Mike: Я хочу узнать, сколько времени занимает мой код C, и миллисекундная точность, которую gprof предоставляет на данный момент, недостаточно хороша, так как весь мой код выполняется за несколько мс. Следовательно, мне нужна более высокая точность для времени, затраченного в каждом вызове функции. – godot101

ответ

3

Посмотрите на Linux perf. Однако вам понадобится довольно недавнее ядро.

3

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

Зная, как долго функция принимает включительно за вызов (включая I/O), в среднем, умножается на число вызовов, деленная на общее время, даст вам часть времени под контролем эта функция. Эта дробь - это то, как вы знаете, является ли функция достаточным фактором времени для оптимизации оптимизации. Это нелегкая информация, чтобы получить от gprof.

Другой способ узнать, какая часть инклюзивного времени проводится под контролем каждой функции, - это синхронизация или случайная выборка стека вызовов. Если функция появляется на фракции X выборок (даже если она появляется более одного раза в образце), тогда X - это доля времени, которую он занимает (в пределах погрешности). Более того, это дает вам per-line доля времени, а не только за функцию.

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

Zoom profiler является хорошим инструментом для получения этой информации.

Что бы я сделал, это обернуть длинный цикл вокруг кода верхнего уровня, чтобы он выполнялся многократно, достаточно долго, чтобы занять не менее нескольких секунд. Затем я вручную проверил стек, прерывая или приостанавливая его случайным образом. На самом деле очень мало образцов, например 10 или 20, чтобы получить действительно четкое представление о наиболее трудоемких функциях и/или строках кода.

Here's an example.

P.S. Если вас беспокоит статистическая точность, позвольте мне получить количественный характер. Если функция или строка кода находится в стеке ровно в 50% случаев, и вы берете 10 выборок, то количество образцов, которые показывают это, будет 5 +/- 1,6, с погрешностью в 16%. Если фактическое время меньше или больше, погрешность уменьшается. Вы также можете уменьшить погрешность, взяв больше образцов. Чтобы получить 1,6%, возьмите 1000 образцов. Собственно, как только вы нашли проблему, вам решать, нужен ли вам небольшой запас ошибки.

1

oprofile получает вам время в разрешении часов, то есть наносекундах, он создает выходные файлы, совместимые с gprof, поэтому очень удобно использовать.

http://oprofile.sourceforge.net/news/

2

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