多核处理器时,__rdtsc()的使用-编程珠玑第一章

根据书中提供的代码清单1-5,可以完成对于多核处理器的cpu占用率的控制。

但是在使用GetCPUTickCount计时时,下面的算式会出现一点小问题:

这里按照变量millisec 定义的名字,认为后面算式计算的结果是毫米ms,但是

((double)t_end – (double)t_begin)/(double)info.CurrentMhz

实际计算出的结果单位是秒,因为

__rdtsc()得到的cpu周期数,CurrentMhz为cpu频率,单位为MHZ=周期/秒=周期*1000/毫秒

所以如果在代码中定义让cpu工作10ms,休息10ms时,这里实际计算出的时间(单位s)和想要的时间(单位ms)会相差1000,

结果是在任务管理器中看到cpu的占占用率曲线基本没变化!

代码清单1-5

_PROCESSOR_POWER_INFORMATION info;

CallNTPowerInformation(11, // query processor power information

NULL, // no input buffer

0, // input buffer size is zero

&info, // output buffer

Sizeof(info)); // outbuf size

__int64 t_begin = GetCPUTickCount();

// do something

__int64 t_end = GetCPUTickCount();

double millisec = ((double)t_end – (double)t_begin)/(double)info.CurrentMhz;

多核cpu中控制,cpu使用率曲线:

int main() 



    HANDLE curhandle = GetCurrentThread();//获取当前线程句柄 

    DWORD_PTR dwThreadAffinityMask = 2; 

    if(!SetThreadAffinityMask(curhandle, dwThreadAffinityMask)) 

    { 

        return 0; 

    }

int busytime = 10;//10ms 

    int idletime = busytime; 

    //DWORD starttime = 0; 

    //获取当前cpu的周期数 

    PROCESSOR_POWER_INFORMATION lpOutputBuffer; 

    CallNtPowerInformation( 

        ProcessorInformation,//获得处理器信息 

        NULL, 

        0, 

        &lpOutputBuffer, 

        sizeof(lpOutputBuffer) 

    ); 

    printf("%d",lpOutputBuffer.CurrentMhz); 

    unsigned __int64 starttime; 

    unsigned __int64 endtime; 

    while(1) 

    { 

        starttime = __rdtsc(); 

        //注意:这个地方要再除以一个1000,因为想要求的是ms单位,__rdtsc()得到的cpu周期数, 

        //CurrentMhz为cpu频率,单位为MHZ=周期/秒=周期*1000/毫秒 

        while((((double)__rdtsc() - (double)starttime)/1000/(double)lpOutputBuffer.CurrentMhz) <= busytime); 

        Sleep(idletime); 

    } 

    return 0; 



#endif

最新文章

  1. Moon.Orm 5.0(MQL版)分页功能的设计(求指教,邀请您的加入)
  2. 【JavaScript】Write和Writeln的区别
  3. 设计模式之美:Creational Patterns(创建型模式)
  4. SQL 计算两个时间之差 分类: SQL Server 2014-07-04 10:57 119人阅读 评论(0) 收藏
  5. hdu4493 Tutor
  6. Phpcms V9缩略图裁剪存在黑边的解决方法
  7. fread读取文件(二进制文件)
  8. 嵌入式 Linux 与linux启动时自动加载模块
  9. 深入理解springMVC思想
  10. Git使用注意事项
  11. XML详解二XML的解析与创建
  12. Redis在CentOS和Windows安装过程
  13. MYSQL登录函数(第3版本)
  14. 【洛谷P1463】反素数
  15. 安全测试7_Web安全在线工具
  16. POJ 1637 - Sightseeing tour - [最大流解决混合图欧拉回路]
  17. (1.1)mysql 选择合适的数据类型
  18. discuz目录结构和插件创建
  19. jQuery/javascript实现IP/Mask自动联想功能
  20. app.js:1274 [Vue warn]: Error in render: &quot;TypeError: Cannot read property &#39;object_id&#39; of undefined&quot;问题小记

热门文章

  1. 6、获取Class中的方法
  2. for迭代多个对象
  3. P1578 奶牛浴场 有障碍点的最大子矩形
  4. border-style
  5. JAVA类的无参方法
  6. sizeof +数组名
  7. 【csp模拟赛6】树上统计-启发式合并,线段树合并
  8. 爬虫之python3用execjs执行JS代码
  9. 中国传统色彩名录及其RGB值
  10. Servlet容器:Jetty和tomcat的比较