编程之美——CPU占用率

写一个程序,让用户决定Windows任务管理器的CPU占用率。
1. 50%CPU占用率。
2. 任意比例。
3. 正弦曲线。

  • 解法一:简单的解法

假设CPU是2.4GHz(2.4 * 10的9次方个时钟周期每秒),CPU执行的是机器指令,最接近机器指令的语言是汇编语言,如下空循环翻译成5条汇编代码。( 2 400 000 000 * 2 ) / 5 = 960 000 000 (循环/秒)。若让CPU工作1秒钟,然后休息1秒钟,波形很可能变成锯齿状。所以降低两个数量级,同时10ms比较接近windows的调度时间片。

#include <stdio.h>
#include <Windows.h>

int main() {
    for (; ;) {
        for (int i = 0; i < 9600000; i++) {
            ;
        }
        Sleep(10);
    }
};

怎么让CPU“闲下来”?
—-> 或者等待用户的输入,或者等待某些事件发生,或者主动进入休眠状态。

  • 解法二:使用GetTickCount()和Sleep()
    GetTickCount()可以得到“系统启动到现在”所经历时间的毫秒值。
    const DWORD busyTime = 10;
    const DWORD idleTime = busyTime;

    while(true) {
        DWORD startTime = GetTickCount();

        while ( (GetTickCount() - startTime) <= busyTime )
            ;

        Sleep(idleTime);
    }
  • 解法三:能动态适应的解法
static void MakeUsage(float level)
{
    PerformanceCounter p = new PerformanceCounter("Processor", "%Processor Time", "_Total");

    while (true)
    {
        if (p.NextValue() > level)
            System.Threading.Thread.Sleep(10);
    }
}
  • 解法四:正弦曲线
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值