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

版权声明:本文为博主原创文章,转载请注明出处-- https://blog.csdn.net/qq_38790716/article/details/90232643

C P U CPU 占用率 = C P U CPU 忙的时间 / / 刷新周期总时间

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

由于个人电脑参数不一致,所以运用该程序得到的 C P U CPU 占用率可能不会等于 50 50% ,但大致看出 C P U CPU 占用率为一条直线:
在这里插入图片描述

利用 G e t T i c k C o u n t ( ) GetTickCount() 计算时间,但会出现一个问题,即操作系统上有很多程序会同时执行很多任务,其余进程如果使用了 10 10 %的 C P U CPU ,那我们就只能使用 40 40 %的 C P U CPU ,这样才能达到 50 50 %的效果

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

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

运行结果如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_38790716/article/details/90232643