您的位置:首页 > 编程语言

【读书笔记】《编程之美》1.1——让CPU占用率听你指挥——四种解法

2010-10-12 14:29 309 查看
同步更新博客:http://idaoteng.blogbus.com/logs/78073683.html

 

【解法一】

试验Sleep()函数,本机CPU是2.93Ghz(2.93*10的九次方个时钟周期每秒)

CPU1秒钟可运行空循环for(i=0;i

取10ms以接近Windows的调度时间片,即睡眠时间相应改为10ms,n=1172000000

注意:Sleep()函数

  功 能: 执行挂起一段时间

  用 法: unsigned sleep(unsigned seconds);

  在VC中使用带上头文件

  #include

  在gcc编译器中,使用的头文件因gcc版本的不同而不同

  #include

  在VC中Sleep中的第一个英文字符为大写的"S"

代码:

#include

int main()
{
     for(; ;)
     {
          for(int i=0;i<11720000;i++)
              ;
          Sleep(10);
      }
 return 0 ;
}

但运行程序后,查看任务管理器性能,CPU占用率在36%和37%之间变化,没能显示一条大致稳定的50%CPU占用率直线。——怎样才能达到稳定的50%呢?试过修改n值,发现CPU变化更大了,一会40%,一会30%~~~~

PS:看到书中的【讨论】才想到:哦,我的电脑是双核。。。,多CPU怎么实现需要再研究,

不过在这个博客里有提到,暂时还没自己看~~
http://blog.csdn.net/jcwKyl/archive/2009/02/16/3897533.aspx#1509379
在评论回复部分

【解法二】使用GetTickCount()和Sleep()

GetTickCount()函数

函数功能:GetTickCount返回从操作系统启动到现在所经过的毫秒数,它的返回值是DWORD。

#include

int main()
{
 int busyTime=10;     //10ms
 int idleTime=busyTime;    //same ratio will lead to 50% cpu usage

 unsigned _int64 startTime=0;  //书中未Int64 startTime,运行有错误
 while(true)
 {
  startTime=GetTickCount();
  //busy loop
  while((GetTickCount()-startTime)<=busyTime)
   ;

  //idle loop
  Sleep(idleTime);
 }
}

运行结果基本稳定在50%的CPU占用率,偶尔跳到51%,效果还是很不错的。

【解法三】利用系统监视器perfmon

C#代码,只看了看。。。

Perfmon可或许有关操作系统、应用程序和硬件的各种效能计数器

这里有performancecounter用法链接:http://www.cnblogs.com/SunYu/archive/2010/04/29/1723960.html ,讲的很详细

【解法四】正弦曲线



#include
#include
#include
const double SPLIT=0.01;
const int COUNT=200;
const double PI=3.1415926;
const int INTERVAL=300;

int main(int argc,CHAR* argv[])   //书中大概运行在VS下,我稍改此句,运行在VC++6.0版
{
 DWORD busySpan[COUNT];     //array of busy times
    DWORD idleSpan[COUNT];     //array of idle times
 int half=INTERVAL/2;
 double radian=0.0;
 for(int i=0;i {
  busySpan[i]=(DWORD)(half+(sin(PI*radian)*half));
  idleSpan[i]=INTERVAL-busySpan[i];
  radian+=SPLIT;
 }
 DWORD startTime=0;
 int j=0;
 while(true)
 {
  j=j%COUNT;
  startTime=GetTickCount();
  while((GetTickCount()-startTime)<=busySpan[j])
   ;
  Sleep(idleSpan[j]);
  j++;
 }

  return 0 ; 
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息