Tuesday, December 10, 2013

[C++] 纳秒(ns)级精度的计时

在调试以及优化高性能的程序中,常需要对一小段程序计时. 普通的clock函数精度达不到ns级别.这里记录一下几种可以得到ns级高精度的计时方法.

使用clock_gettime


C++ 中可以使用clock_gettime, 得到
 
    clock_gettime(CLOCK_REALTIME, &time1);
    ... your code to profile ...
    clock_gettime(CLOCK_REALTIME, &time2);

使用rdtscp


如果想得到更高精度的计时, 比如以CPU的时钟周期为单位, 对于比较新的Intel CPU, 可以使用rdtscp指令来获得当前CPU时钟周期读数.比较前后两次读数就可以得到以时钟周期为单位的逝去时间.
// rdtscp ensure serialization, supported by newer CPUs
static __inline__ uint64_t rdtscp(void)
{
    uint32_t hi, lo;
    __asm__ __volatile__ ("rdtscp" : "=a"(lo), "=d"(hi));
    return ((uint64_t)lo | ((uint64_t)hi << 32);
}