TSC計時——高精度,低消耗

WesleyWang97發表於2018-04-21

   rdtsc指令返回的是自開機始CPU的週期數,返回的是一個64位的值EDX:EAX(高32在EDX,低32位在EAX)。OK,完全可以利用這條指令,測試我們的關注的一段程式碼的執行效率。

   rdtsc直接通過彙編從暫存器中獲取時間,時間消耗極低(0.0Xus左右的消耗,具體X為多少與機器本身相關)。精度可以精確到ns級別。

// 返回64位的CPU circle次數
inline unsigned long long getTimeByTSC(){
#if defined(__GNUC__)
#   if defined(__i386__)
    uint64_t x;
        __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));
        return x;
#   elif defined(__x86_64__)
    uint32_t hi, lo;
    __asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
    return ((uint64_t)lo) | ((uint64_t)hi << 32);
#   else
#       error Unsupported architecture.
#   endif
#elif defined(_MSC_VER)
    __asm {
            return __rdtsc();
        }
    #else
    #   error Other compilers not supported...
#endif
}

相關文章