CPU 實際時脈會隨溫度、電壓波動。利用處理器的 時間戳記計數器(TSC),透過 RDTSC 指令(機器碼 0F 31)讀取自開機以來的時脈週期數。測量固定時間間隔(如 1 秒)內的時脈增量,即可估算當前 CPU 頻率。
專案名 CPUSpeed,預設選項即可。
對話方塊加入按鈕「測試 CPU 速度」,雙擊產生 OnButton1 處理函數。
// 內嵌組語讀取 TSC
inline unsigned __int64 theCycleCount(void) {
_asm _emit 0x0F
_asm _emit 0x31
// 編譯器警告無返回值,實際 RDTSC 將 64 位結果放在 EDX:EAX
}
class CTimer {
unsigned __int64 m_start;
public:
unsigned __int64 m_overhead;
CTimer() : m_overhead(0) {
Start();
m_overhead = Stop(); // 校準呼叫開銷
}
void Start() { m_start = theCycleCount(); }
unsigned __int64 Stop() {
return theCycleCount() - m_start - m_overhead; // 扣除開銷
}
};
void CCPUSpeedDlg::OnButton1() {
CString strResult;
CTimer timer;
timer.Start();
Sleep(1000); // 等待 1 秒
unsigned cpuSpeed100 = (unsigned)(timer.Stop() / 10000); // 單位:0.01 MHz
long mhz = cpuSpeed100 / 100;
long frac = cpuSpeed100 % 100;
strResult.Format(_T("%d.%02d MHz 估算值"), mhz, frac);
AfxMessageBox(_T("CPU 速度為 ") + strResult);
}
Start()/Stop() 本身的開銷,後續測量自動扣除。QueryPerformanceCounter)作為基準時間來源。本範例展示如何在 VC++ 中結合內嵌組語與 MFC 快速建立 CPU 時脈測試工具。核心在於 RDTSC 指令的直接存取與開銷校準技巧,程式碼精簡且實用,可作為硬體監控軟體的基礎模組。