计算线程时间, 频率,周期,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;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值