QueryPerformanceFrequency,RDTSC,CPU频率

来源:互联网 发布:mysql 查询赋值给变量 编辑:程序博客网 时间:2024/06/05 06:12
//warning C4035: 'RDTSC' : no return value#pragma warning(disable:4035) #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;}