如何在 Linux 中创建高分辨率计时器来测量程序性能?

新手上路,请多包涵

我正在尝试将 GPU 与 CPU 性能进行比较。对于 NVIDIA GPU,我一直在使用 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 中创建高分辨率计时器的方法吗?

原文由 sj755 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 640
2 个回答

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

如果在阅读了手册页后,您想知道 CLOCK_REALTIMECLOCK_MONOTONIC 之间的区别,请参阅 CLOCK_REALTIME 和 CLOCK_MONOTONIC 之间的区别?

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

 #include <iostream>
#include <time.h>
using namespace std;

timespec diff(timespec start, timespec end);

int main()
{
    timespec time1, time2;
    int temp;
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1);
    for (int i = 0; i< 242000000; i++)
        temp+=temp;
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);
    cout<<diff(time1,time2).tv_sec<<":"<<diff(time1,time2).tv_nsec<<endl;
    return 0;
}

timespec diff(timespec start, timespec end)
{
    timespec temp;
    if ((end.tv_nsec-start.tv_nsec)<0) {
        temp.tv_sec = end.tv_sec-start.tv_sec-1;
        temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec;
    } else {
        temp.tv_sec = end.tv_sec-start.tv_sec;
        temp.tv_nsec = end.tv_nsec-start.tv_nsec;
    }
    return temp;
}

原文由 NPE 发布,翻译遵循 CC BY-SA 4.0 许可协议

总结到目前为止提供的信息,这是典型应用程序所需的两个功能。

 #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_sec - start_time.tv_sec) * (long)1e9 + (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);

原文由 Alex 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题