Измерение производительности / профилирования в C - PullRequest
1 голос
/ 13 января 2010

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

Я использовал clock; от K & R:

clock возвращает процессорное время, используемое программой с начала выполнения, или -1, если недоступно.

Мне это кажется разумным и дает результаты, которые в целом соответствуют моим ожиданиям. Но есть ли что-нибудь лучше, чтобы увидеть, какие модификации улучшают / ухудшают эффективность моего кода?

Обновление: меня интересуют как Windows, так и Linux; что-то, что работает на обоих, было бы идеально.

Обновление 2: меня меньше интересует профилирование сложная проблема, чем общее время выполнения / тактовые циклы, используемые для простой программы от начала до конца - я уже знаю, какие части моей программы медленные clock, кажется, соответствует этому счету, но я не знаю, насколько он уязвим, например, для других процессов, работающих в фоновом режиме и загружающих процессорное время.

Ответы [ 5 ]

4 голосов
/ 13 января 2010

Забудьте функции time (), вам нужно:

Valgrind!

И KCachegrind - лучший интерфейс для изучения статистики профилирования callgrind. В прошлом я переносил приложения на linux просто , поэтому я мог использовать эти инструменты для профилирования.

2 голосов
/ 13 января 2010

Для приблизительного измерения общего времени работы есть time ./myprog.

Но для измерения производительности вы должны использовать профилировщик. Для GCC существует gprof.

Это предполагает использование среды Unix. Я уверен, что есть подобные инструменты для Windows, но я не знаком с ними.

Редактировать: Для пояснения: я советую против , используя любые функции стиля gettime () в вашем коде. Профилировщики разрабатывались десятилетиями, чтобы выполнять работу, которую вы пытаетесь выполнить с помощью пяти строк кода, и предоставлять гораздо более мощный, универсальный, ценный и надежный способ выяснить, где ваш код тратит свои циклы.

1 голос
/ 13 января 2010

Я обнаружил, что программы синхронизации и поиск вещей для оптимизации - две разные проблемы, и для них обоих я лично предпочитаю низкотехнологичные.

Для определения времени, хитрость заключается в том, чтобы сделать это достаточно долго, обернув вокруг него петлю. Например, если вы повторяете операцию 1000 раз и отсчитываете время секундомером, то при удалении цикла секунды превращаются в миллисекунды.

Для нахождения вещей, которые нужно оптимизировать, существуют фрагменты кода (инструкции терминала и вызовы функций), которые отвечают за различные доли времени. За это время они выставляются в стеке. Таким образом, вы можете обернуть цикл вокруг программы, чтобы она заняла достаточно много времени, а затем сделать стеков . Код для оптимизации выскочит на вас.

1 голос
/ 13 января 2010

В POSIX (например, в Linux) вы можете использовать <a href="http://dell5.ma.utexas.edu/cgi-bin/man-cgi?gettimeofday+2" rel="nofollow noreferrer">gettimeofday()</a>, чтобы получить более точные значения синхронизации (микросекунды).

В Win32 <a href="http://dell5.ma.utexas.edu/cgi-bin/man-cgi?gettimeofday+2" rel="nofollow noreferrer">QueryPerformanceCounter()</a> популярно.

Остерегайтесь эффектов изменения тактовой частоты ЦП, если ваш ЦП решит отключить тактовую частоту во время теста, результаты могут быть искажены.

0 голосов
/ 13 января 2010

Если вы можете использовать функции POSIX, взгляните на clock_gettime. Я нашел пример из быстрого поиска в Google о том, как его использовать. Чтобы измерить время процессора, затраченное вашей программой, вам нужно передать CLOCK_PROCESS_CPUTIME_ID в качестве первого аргумента clock_gettime, если ваша система его поддерживает. Поскольку clock_gettime использует struct timespec, вы, вероятно, можете получить полезное наносекундное разрешение.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...