首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC++

VC++ 嵌入組語精準計時:RDTSC 指令獲取程式碼執行週期數

     編輯:VC++

高精度程式碼計時原理

Pentium 處理器內建 64 位元時間戳記計數器 (TSC),RDTSC 指令可讀取其值 (EDX:EAX)。兩次讀取差值即為程式碼執行的時脈週期數,除以 CPU 頻率得精確秒數。

核心組語實作

// 取得起始計數
__asm {
    RDTSC
    mov HighStart, edx
    mov LowStart, eax
}

// 待測程式碼區塊
for (int i = 0; i < 100000; i++)
    for (int j = 0; j < 100000; j++);

// 取得結束計數並計算差值
__asm {
    RDTSC
    mov HighEnd, edx
    mov LowEnd, eax
    sub eax, LowStart
    cmp eax, 0
    jg L1
    neg eax
    jmp L2
L1: mov numlow, eax
L2: sbb edx, HighStart
    mov numhigh, edx
}

// 組合 64 位元週期數並換算秒數 (以 1.1GHz CPU 為例)
__int64 timer = (numhigh << 32) + numlow;
cout << (double)(timer / 1.1 / 1000000000) << endl;

關鍵細節

  • RDTSC 回傳值於 EDX:EAX (高 32 位:低 32 位)
  • 減法需處理借位:sbb (含借位減法) 處理高 32 位
  • 測試代碼本身含組語指令開銷 (~3e-8 秒 @ 1.1GHz),可扣除校正
  • 專業分析工具 (VTune, Profiler) 更準確,但 DIY 學習嵌入組語、32/64 位元暫存器操作極有價值

完整可編譯範例

#include <iostream>
using namespace std;

int main() {
    long HighStart, LowStart, HighEnd, LowEnd, numhigh, numlow;
    __asm { RDTSC; mov HighStart, edx; mov LowStart, eax; }
    for (int i = 0; i < 100000; i++) for (int j = 0; j < 100000; j++);
    __asm {
        RDTSC; mov HighEnd, edx; mov LowEnd, eax;
        sub eax, LowStart; cmp eax, 0; jg L1; neg eax; jmp L2;
        L1: mov numlow, eax; L2: sbb edx, HighStart; mov numhigh, edx;
    }
    __int64 timer = (numhigh << 32) + numlow;
    cout << "Elapsed: " << (double)(timer / 1.1 / 1000000000) << " sec" << endl;
    return 0;
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved