Как я могу найти время выполнения раздела моей программы в C? - PullRequest
16 голосов
/ 06 октября 2008

Я пытаюсь найти способ получить время выполнения части кода в C. Я уже пробовал time () и clock () из time.h, но похоже, что time () возвращает Секунды и часы (), кажется, дают мне миллисекунды (или центсекунды?) Я хотел бы что-то более точное, хотя. Есть ли способ, которым я могу захватить время с точностью до микросекунды?

Это нужно только для возможности компиляции в Linux.

Ответы [ 11 ]

15 голосов
/ 06 октября 2008

Вы ссылались на clock() и time() - искали gettimeofday()? Это заполнит struct timeval, который содержит секунды и микросекунды.

Конечно, фактическое разрешение зависит от аппаратного обеспечения.

12 голосов
/ 06 октября 2008

Для чего это стоит, вот один, это всего лишь несколько макросов:

#include <time.h>
clock_t startm, stopm;
#define START if ( (startm = clock()) == -1) {printf("Error calling clock");exit(1);}
#define STOP if ( (stopm = clock()) == -1) {printf("Error calling clock");exit(1);}
#define PRINTTIME printf( "%6.3f seconds used by the processor.", ((double)stopm-startm)/CLOCKS_PER_SEC);

Тогда просто используйте его с:

main() {
  START;
  // Do stuff you want to time
  STOP;
  PRINTTIME;
}

С http://ctips.pbwiki.com/Timer

11 голосов
/ 06 октября 2008

Вы хотите приложение profiler .

Ключевые слова для поиска в SO и поисковых системах: linux profiling

3 голосов
/ 06 октября 2008
2 голосов
/ 06 октября 2008

Попробуйте "bench.h" ; это позволяет вам поставить START_TIMER; и STOP_TIMER («имя»); в ваш код, что позволяет вам произвольно тестировать любой раздел кода (примечание: рекомендуется только для коротких разделов, а не для вещей, занимающих десятки миллисекунд или более). Он точен в тактовом цикле, хотя в некоторых редких случаях он может изменить способ компиляции промежуточного кода, и в этом случае вам лучше использовать профилировщик (хотя профилировщики, как правило, требуют больше усилий для конкретных разделов кода).

Работает только на x86.

1 голос
/ 22 октября 2010

gettimeofday() предоставляет вам разрешение в микросекундах, тогда как clock_gettime() предоставляет вам разрешение в наносекундах.

int clock_gettime(clockid_t clk_id, struct timespec *tp);

clk_id указывает часы, которые будут использоваться. Используйте CLOCK_REALTIME, если вы хотите, чтобы общесистемные часы были видны всем процессам. Используйте CLOCK_PROCESS_CPUTIME_ID для таймера для каждого процесса и CLOCK_THREAD_CPUTIME_ID для таймера, специфичного для потока.

1 голос
/ 06 октября 2008

Вы не найдете библиотечного вызова, который позволит вам преодолеть разрешение часов вашей платформы. Либо используйте профилировщик (man gprof), как предложил другой автор, либо - быстро и грязно - поместите цикл вокруг нарушающего кода раздела, чтобы выполнить его много раз, и используйте clock ().

1 голос
/ 06 октября 2008

Возможно, вы захотите воспользоваться Google * для инструмента .

0 голосов
/ 20 октября 2010

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

0 голосов
/ 06 июля 2009

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

Этот подход позволяет вам:

  1. Получение точных результатов с таймерами низкого разрешения.

  2. Не сталкиваться с проблемами, когда инструментарий мешает высокоскоростным кэшам (l2, l1, branch..etc) вблизи процессора Однако выполнение одного и того же кода в узком цикле также может дать оптимистичные результаты, которые могут не отражать реальных условий.

...