Timer function to provide time in nano seconds using C++

前端 未结 16 2340
野趣味
野趣味 2020-11-22 06:02

I wish to calculate the time it took for an API to return a value. The time taken for such an action is in the space of nano seconds. As the API is a C++ class/function, I a

16条回答
  •  半阙折子戏
    2020-11-22 06:12

    To do this correctly you can use one of two ways, either go with RDTSC or with clock_gettime(). The second is about 2 times faster and has the advantage of giving the right absolute time. Note that for RDTSC to work correctly you need to use it as indicated (other comments on this page have errors, and may yield incorrect timing values on certain processors)

    inline uint64_t rdtsc()
    {
        uint32_t lo, hi;
        __asm__ __volatile__ (
          "xorl %%eax, %%eax\n"
          "cpuid\n"
          "rdtsc\n"
          : "=a" (lo), "=d" (hi)
          :
          : "%ebx", "%ecx" );
        return (uint64_t)hi << 32 | lo;
    }
    

    and for clock_gettime: (I chose microsecond resolution arbitrarily)

    #include 
    #include 
    // needs -lrt (real-time lib)
    // 1970-01-01 epoch UTC time, 1 mcs resolution (divide by 1M to get time_t)
    uint64_t ClockGetTime()
    {
        timespec ts;
        clock_gettime(CLOCK_REALTIME, &ts);
        return (uint64_t)ts.tv_sec * 1000000LL + (uint64_t)ts.tv_nsec / 1000LL;
    }
    

    the timing and values produced:

    Absolute values:
    rdtsc           = 4571567254267600
    clock_gettime   = 1278605535506855
    
    Processing time: (10000000 runs)
    rdtsc           = 2292547353
    clock_gettime   = 1031119636
    

提交回复
热议问题