如何在Linux中创build高分辨率定时器来衡量程序性能?

我试图比较GPU的CPU性能。 对于NVIDIA GPU,我一直使用cudaEvent_ttypes来获得非常精确的时间。

对于我一直在使用以下代码的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中创build高分辨率定时器的方法吗?

查看clock_gettime ,这是高分辨率定时器的POSIX接口。

如果在阅读完联机帮助页之后CLOCK_REALTIME知道CLOCK_REALTIMECLOCK_MONOTONIC之间的区别,请参阅CLOCK_REALTIME和CLOCK_MONOTONIC之间的区别?

有关完整示例,请参阅以下页面: http : //www.guyrutenberg.com/2007/09/22/profiling-code-using-clock_gettime/

总结迄今为止提供的信息,这些是典型应用所需的两个function。

 #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; } 

下面是一个如何使用它们来计算input列表的方差需要多长时间的例子。

 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); 
 struct timespec t; clock_gettime(CLOCK_REALTIME, &t); 

还有CLOCK_REALTIME_HR,但我不确定它是否有任何区别。

你是否感兴趣的时间(实际经过多less时间)或循环次数(多less次循环)? 在第一种情况下,您应该使用gettimeofday东西。

最高分辨率的定时器使用RDTSC x86汇编指令。 但是,这会测量时钟节拍,所以您应该确保节能模式已禁用。

TSC的wiki页面提供了几个例子: http : //en.wikipedia.org/wiki/Time_Stamp_Counter

clock_gettime(2)