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

本文介绍如何通过编程控制CPU占用率保持在特定水平,包括实现50%占用率的空循环方法及考虑系统负载的调整策略。此外,还展示了如何绘制随时间变化的正弦曲线,使CPU占用率呈现波动状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值