天天看点

计算线程时间, 频率,周期,CPU频率

获取线程时间 . GetThreadTimes , 这个函数并不准

//转换函数
__int64 convert64(FILETIME ft)
{
//    return (((__int64)ft.dwHighDateTime)<<32) | ft.dwLowDateTime;  
    ULARGE_INTEGER ui;
    ui.LowPart = ft.dwLowDateTime;
    ui.HighPart = ft.dwHighDateTime;
    return ui.QuadPart;
}


 FILETIME ctime,etime,ktime,utime;
 FILETIME ctime2,etime2,ktime2,utime2;
 GetThreadTimes(GetCurrentThread(),&ctime,&etime,&ktime,&utime);

 Sleep(3000); //执行别的

 GetThreadTimes(GetCurrentThread(),&ctime2,&etime2,&ktime2,&utime2);

        cout << convert64(ctime) << "," <<convert64(etime) << ","  <<convert64(ktime) << ","  <<convert64(utime) << endl;
        cout << convert64(ctime2) << "," <<convert64(etime2) << ","  <<convert64(ktime2) << ","  <<convert64(utime2) << endl;

cout << "elapsed:" << convert64(ktime2) - convert64(ktime) + (convert64(utime2) - convert64(utime)) << endl;
           
//这个版本或许比较准确;
    
        //QueryPerformanceFrequency  获取计数器的频率
        //QueryPerformanceCounter  高精度计时器的值,精确定时器

        LARGE_INTEGER  large_interger;
        __int64  f,first,second;

        //获取频率 , 微秒为单位
        QueryPerformanceFrequency(&large_interger);
        f = large_interger.QuadPart; //QuadPart 的类型 == __int64

        //第一次
        QueryPerformanceCounter(&large_interger);
        first = large_interger.QuadPart;

        Sleep(1000);  

        QueryPerformanceCounter(&large_interger);
        second  = large_interger.QuadPart;

        printf("fre:%I64d\n", f);
        printf("elapsed time (ms) :%I64d\n", (second -first) * 1000 / f ); //微秒
           

一个简单的函数获取当前线程的周期数:

unsigned __int64 getCycles(DWORD msec)
{
    int pri = GetThreadPriority(GetCurrentThread());

    //把当前线程优先级设置为最高或许比较准确;
    SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_HIGHEST);
    unsigned __int64 start = ReadTimeStampCounter();
    Sleep(msec);
    SetThreadPriority(GetCurrentThread(),pri);
    return ReadTimeStampCounter()  - start;
}
           

不考虑多核的情况下计算频率

//以微秒计算频率
__int64 getThreadCpuFrequencyInMHZ()
{
    int pri = GetThreadPriority(GetCurrentThread());
    SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_HIGHEST);
    LARGE_INTEGER li;
    __int64 fre, c1,c2;
    //获取频率
    QueryPerformanceFrequency(&li);
    fre = li.QuadPart;
    //获取计数器
    QueryPerformanceCounter(&li);
    c1 = li.QuadPart;
    QueryPerformanceCounter(&li);
    c2 = li.QuadPart;
    // 计算一个起始值
    __int64 starttime = (c2-c1)*1000000 / fre;

    //起始周期数
     unsigned __int64 start_cycle = ReadTimeStampCounter();

     //等1秒
     Sleep(1000);

     //经过了多少周期数
     unsigned __int64 n_cycle = ReadTimeStampCounter() - start_cycle;

     QueryPerformanceCounter(&li);
     __int64 c3  = li.QuadPart;
     __int64 endtime = (c3-c1)*1000000 / fre;
     __int64 elapsed = endtime - starttime;
     SetThreadPriority(GetCurrentThread(),pri);
     return n_cycle / elapsed;
}