同步更新博客: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 ;
}