编程之美(一)CPU占用率控制
占用率 = 忙的时间刷新周期总时间
1.控制CPU占用率为50%
- 通过执行空循环来实现,(空闲)通过来实现
- 参考书籍讲解
#include <iostream>
#include <windows.h>
using namespace std;
int main() {
for (;;) {
for (int i = 0; i < 9600000; ++i);
Sleep(10); //10ms比较接近windows的调度时间片
}
return 0;
}
由于个人电脑参数不一致,所以运用该程序得到的占用率可能不会等于,但大致看出占用率为一条直线:
利用计算时间,但会出现一个问题,即操作系统上有很多程序会同时执行很多任务,其余进程如果使用了%的,那我们就只能使用%的,这样才能达到%的效果
#include <iostream>
#include <windows.h>
using namespace std;
const DWORD busyTime = 10;
const DWORD idleTime = busyTime;
INT64 startTime = 0;
int main() {
while (true) {
DWORD startTime = GetTickCount();
while ((GetTickCount() - startTime) <= busyTime);
Sleep(idleTime);
}
return 0;
}
以上两种方式都是假设当前只运行该程序,那么占用率必然等于50%
2.绘制正弦曲线
//CPU正弦曲线
#include <windows.h>
#include <stdlib.h>
#include <iostream>
#include <math.h>
using namespace std;
//把一条正弦曲线0~2pi之间的弧度等分成200份进行抽样,计算每个抽样点的振幅
//然后把每隔300ms的时间取下一个抽样点,并让CPU工作对应振幅的时间
const int SAMPLING_COUNT = 200; //抽样点数量
const double PI = 3.1415926535; //pi值
const int TOTAL_AMPLITUDE = 300; //每个抽样点对应的时间片
int main(int argc, char ** argv) {
//指定CPU,避免线程迁移
HANDLE h_cur = GetCurrentThread();
SetThreadAffinityMask(h_cur, 0x01);
DWORD busySpan[SAMPLING_COUNT]; //每个抽样点工作时间
int amplitude = TOTAL_AMPLITUDE / 2;
double radian = 0.0;
double radianIncrement = 2.0 / (double)SAMPLING_COUNT; //抽样弧度的增量
for (int i = 0; i < SAMPLING_COUNT; ++i) {
busySpan[i] = (DWORD)(amplitude + sin(PI * radian) * amplitude); //计算工作时间
radian += radianIncrement;
//printf("%d\t%d\n", busySpan[i], TOTAL_AMPLITUDE - busySpan[i]);
}
DWORD startTime = 0;
for (int j = 0;; j = (j + 1) % SAMPLING_COUNT) {
startTime = GetTickCount(); //滴答,记录时间
while ((GetTickCount() - startTime) <= busySpan[j]); //CPU工作
Sleep(TOTAL_AMPLITUDE - busySpan[j]); //空闲时间,总时间片-工作时间
}
return 0;
}
运行结果如下: