2010-01-13 2 views
1

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

Я пользуюсь clock; от K & R:

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

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

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

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

+0

Я не знаю профилеровщика, который работает на более чем одном O/S. Используйте либо более одного (для каждого O/S), либо используйте один для одного O/S, и надейтесь, что улучшения, которые вы делаете в результате профилирования на одной платформе, автоматически будут улучшены и на другой платформе. – ChrisW

ответ

1

В POSIX (например, в Linux) вы можете использовать gettimeofday() для получения значений точности с высокой точностью (микросекунды).

В Win32, QueryPerformanceCounter() популярен.

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

2

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

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

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

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

0

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

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

4

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

Valgrind!

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

1

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

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

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

+0

+1 для циклизации, чтобы продлить продолжительность, и я бы хотел добавить еще один +1 для последнего абзаца. – ChrisW

+0

@ChrisW: Биологи называют это «усиливающим сигнал», когда они делают миллионы копий части ДНК, чтобы они могли ее прочитать. –

Смежные вопросы