микросекундный профилировщик для кода C - PullRequest
5 голосов
/ 24 мая 2010

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

Ответы [ 4 ]

3 голосов
/ 25 мая 2010

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

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

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

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

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

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

Вот пример.

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

3 голосов
/ 24 мая 2010

Взгляните на Linux perf . Вам понадобится довольно свежее ядро.

2 голосов
/ 10 декабря 2011

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

1 голос
/ 25 мая 2010

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

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

...