#include "windows.h" //RDTSC-Read Time-Stamp Counter //自开机以来CPU经历的时钟周期数 unsigned __int64 RDTSC() { __asm _emit 0x0F; __asm _emit 0x31; } //CPU的频率 double CpuFrequency() { //On a multiprocessor machine, it should not matter which processor is called. //However, you can get different results on different processors due to bugs in //the BIOS or the HAL. To specify processor affinity for a thread, use the SetThreadAffinityMask function. HANDLE hThread=GetCurrentThread(); SetThreadAffinityMask(hThread,0x1); //主板上高精度定时器的晶振频率 //这个定时器应该就是一片8253或者8254 //在intel ich7中集成了8254 LARGE_INTEGER lFrequency; QueryPerformanceFrequency(&lFrequency); //printf("高精度定时器的晶振频率:%1.0fHz.\n",(double)lFrequency.QuadPart); //这个定时器每经过一个时钟周期,其计数器会+1 LARGE_INTEGER lPerformanceCount_Start; QueryPerformanceCounter(&lPerformanceCount_Start); //RDTSC指令:获取CPU经历的时钟周期数 __int64 _i64StartCpuCounter=RDTSC(); //延时长一点,误差会小一点 //int nTemp=100000; //while (--nTemp); Sleep(200); LARGE_INTEGER lPerformanceCount_End; QueryPerformanceCounter(&lPerformanceCount_End); __int64 _i64EndCpuCounter=RDTSC(); //f=1/T => f=计数次数/(计数次数*T) //这里的“计数次数*T”就是时间差 double fTime=((double)lPerformanceCount_End.QuadPart-(double)lPerformanceCount_Start.QuadPart) /(double)lFrequency.QuadPart; return (_i64EndCpuCounter-_i64StartCpuCounter)/fTime; } int main(int argc, char* argv[]) { printf("CPU频率为:%1.6fMHz.\n",CpuFrequency()/1000000.0); return 0; }
|
|