Как создать таймер высокого разрешения в Linux для измерения производительности программы?
Я пытаюсь сравнить GPU с производительностью процессора. Для графического процессора NVIDIA я использую типы cudaEvent_t для получения очень точного времени.
Для CPU я использовал следующий код:
// Timers
clock_t start, stop;
float elapsedTime = 0;
// Capture the start time
start = clock();
// Do something here
.......
// Capture the stop time
stop = clock();
// Retrieve time elapsed in milliseconds
elapsedTime = (float)(stop - start) / (float)CLOCKS_PER_SEC * 1000.0f;
По-видимому, эта часть кода - это только код, если вы считаете секунды. Кроме того, результаты когда-то выходят довольно странно.
Кто-нибудь знает, как создать таймер с высоким разрешением в Linux?
Ответы
Ответ 1
Отъезд clock_gettime
, который является интерфейсом POSIX для таймеров с высоким разрешением.
Если, прочитав man-страницу, вас не интересует разница между CLOCK_REALTIME
и CLOCK_MONOTONIC
, см. Разница между CLOCK_REALTIME и CLOCK_MONOTONIC?
Для получения полного примера см. следующую страницу: http://www.guyrutenberg.com/2007/09/22/profiling-code-using-clock_gettime/
Ответ 2
Чтобы обобщить представленную до сих пор информацию, это две функции, необходимые для типичных приложений.
#include <time.h>
// call this function to start a nanosecond-resolution timer
struct timespec timer_start(){
struct timespec start_time;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start_time);
return start_time;
}
// call this function to end a timer, returning nanoseconds elapsed as a long
long timer_end(struct timespec start_time){
struct timespec end_time;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end_time);
long diffInNanos = end_time.tv_nsec - start_time.tv_nsec;
return diffInNanos;
}
Вот пример того, как использовать их в определении времени, необходимого для вычисления дисперсии списка ввода.
struct timespec vartime = timer_start(); // begin a timer called 'vartime'
double variance = var(input, MAXLEN); // perform the task we want to time
long time_elapsed_nanos = timer_end(vartime);
printf("Variance = %f, Time taken (nanoseconds): %ld\n", variance, time_elapsed_nanos);
Ответ 3
struct timespec t;
clock_gettime(CLOCK_REALTIME, &t);
есть также CLOCK_REALTIME_HR, но я не уверен, имеет ли это значение.
Ответ 4
Вам интересно время на стене (сколько времени прошло) или количество циклов (сколько циклов)? В первом случае вы должны использовать что-то вроде gettimeofday
.
Таймер с наивысшим разрешением использует инструкцию сборки RDTSC
x86. Тем не менее, это измеряет такты, поэтому вы должны быть уверены, что режим энергосбережения отключен.
Страница wiki для TSC дает несколько примеров: http://en.wikipedia.org/wiki/Time_Stamp_Counter
Ответ 5
clock_gettime(2)