编程之美(一)CPU占用率控制

CPUCPU占用率 = CPUCPU忙的时间//刷新周期总时间

1.控制CPU占用率为50%
  • busyloopbusy loop通过执行空循环来实现,idleidle(空闲)通过Sleep()Sleep()来实现
  • 96000009600000参考书籍讲解
#include <iostream>
#include <windows.h>
using namespace std;
int main() {
    for (;;) {
        for (int i = 0; i < 9600000; ++i);
        Sleep(10);  //10ms比较接近windows的调度时间片
    }
    return 0;
}

由于个人电脑参数不一致,所以运用该程序得到的CPUCPU占用率可能不会等于5050%,但大致看出CPUCPU占用率为一条直线:
编程之美(一)CPU占用率控制

利用GetTickCount()GetTickCount()计算时间,但会出现一个问题,即操作系统上有很多程序会同时执行很多任务,其余进程如果使用了1010%的CPUCPU,那我们就只能使用4040%的CPUCPU,这样才能达到5050%的效果

#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;
}

以上两种方式都是假设CPUCPU当前只运行该程序,那么CPUCPU占用率必然等于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;
}

运行结果如下:
编程之美(一)CPU占用率控制