1.1 控制CPU占用率曲线
在任务管理器的一个刷新周期内,CPU忙的时间和刷新周期总时间的比率,即CPU的占用率,任务管理器显示的是每个刷新周期内CPU占用率的统计平均值。
System Idle Process进程占用了CPU空闲时间 WaitForSingleObject()、Sleep()来使一个进程闲下来
方法1
通过跑busy和Idle两个循环的shijianbili,来调节CPU占用率
CPU的频率 本机为3.70Ghz (3.7*10的9次方个时钟周期每秒),每个时钟周期平均执行两条循环,所以3.7*2*10^9/5=1.48*10^9(循环/秒)一秒钟运行14800000次循环
将循环时间改为10ms
//#include <Windows.h>
//int main()
//{
// for (;;)
// {
// for (int i=0;i<14800000;i++)
// {
// }
// Sleep(10);
// }
// return 0;
//}
结果如下:
大致稳定在50%左右,但锯齿过多
方法2
使用GetTickCount()函数
//#include <Windows.h>
//int main()
//{
// const DWORD busytime=10;
// const DWORD idletime=busytime;
//
// int starttime=0;
// while(true)
// {
// DWORD starttime=GetTickCount();
// while ((GetTickCount()-starttime)<=busytime)
// {
// }
// Sleep(idletime);
// }
//}
结果如下:
这两种解法都是假设系统只有当前程序在执行,故结果占用的CPU会超过50%。
方法3:能动态适应的解法
使用PerformanceCounter对象来获取性能参数
方法4:正弦函数
#include <Windows.h>
#include <stdlib.h>
#include <math.h>
const int S_count=200;
const double PI=3.1415926535;
const int total_A=300;
int main(int argc,CHAR* argv[])
{
DWORD busyspan[S_count];
int amplitude=total_A/2;
double radian=0.0;
double radianIncrement=2.0/(double)S_count;
for (int i=0;i<S_count;i++)
{
busyspan[i]=(DWORD)(amplitude+(sin(PI*radian)*amplitude));
radian+=radianIncrement;
}
DWORD starttime=0;
for (int j=0;;j=(j+1)%S_count)
{
starttime=GetTickCount();
while ((GetTickCount()-starttime)<=busyspan[j])
{
}
Sleep(total_A-busyspan[j]);
}
return 0;
}
结果如下:
结果的CPU占用曲线大致为一个正弦曲线,但其中存在大量锯齿,待解决?
遇到多核和多CPU时