分享

用8254定时芯片计算cpu周期的方式取CPU频率

 juli1546 2014-04-03
#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;  
}  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多