zoukankan      html  css  js  c++  java
  • 让CPU占用率听你指挥

    这道题目只从《编程之美》这本书出了之后,研究它的人不在少数,最近自己也是在快要毕业的阶段,所以拜读了这本书,并在网上看了很多其他的对此题的各种看法。

    下面我主要是作为一种练习题一样,写了差不多的代码,并验证了各种解法。(下面是代码和贴图)

    解法一:简单解法 

    Busy用可循环来实现,for(i=0;i<n;i++) ;

    对应的汇编语言为

    loop;

    mov dx i     ;将i置入dx寄存器

    inc dx          ;将dx寄存器加1

    mov dx i       ;将dx中的值赋回i

    cmp i n         ;比较i和n

    j1 loop          ;i小于n时则重复循环

    我的cpu(双核)1.87GHZ 现代cpu每个时钟周期可执行两条以上的代码,取平均值2,于是

    (1870 000 000*2)/5=744000000(循环/秒) 每秒可以执行循环744000000次

    不能简单的取n=7440000000然后sleep(1000),如果让cpu工作1s,休息1s很可能是锯齿,先达到一个峰值然后跌入一个很低的占有率;所以我们睡眠时间改为10ms,10ms比较接近windows的调度时间,n=7440000。如果sleep时间选的太小,会造成线程频繁的唤醒和挂起,无形中增加了内核时间的不确定性因此代码如下:

    #include "stdafx.h"
    
    #include<windows.h>
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	//50%..
    	//Thread 0 can only run on CPU 0.  
    	SetThreadAffinityMask(GetCurrentProcess(),0x00000001);
    	while(true){
    		for(int i=0;i<744000000;i++);
    		Sleep(10);
    	}
    	return 0;
    }
    

    很显然,是个比较锯齿的样子。


    后面还有很多比较难的解法,涉及的东西比较多,有机会再续。。。


    还是把一篇好的文章附在下面,不多说了,个人觉得很是精彩http://blog.csdn.net/wesweeky/article/details/6402564


  • 相关阅读:
    noip2018练习总结
    东方CannonBall (概率DP)
    数论
    逆序对
    USACO5.3 校园网Network of Schools(Tarjan缩点)
    USACO09FEB 改造路Revamping Trails(分层图模板)
    Comet OJ模拟赛 Day1
    Tarjan模板
    NOIP 天天爱跑步(树上差分)
    树上差分
  • 原文地址:https://www.cnblogs.com/NewWork/p/3260585.html
Copyright © 2011-2022 走看看