编程之美:控制CPU占用率曲线

一、控制CPU占用率曲线

问题1:画出正弦曲线

大致画下来是正弦曲线,但是锯齿状的很厉害,不是很平滑。​​​在这里插入图片描述

代码:
在这里插入图片描述

问题2、CPU的占用率固定在50%,为一条直线。

在这里插入图片描述​​​​
看到这个问题,脑海思索半天,却没想出啥思绪。印象中程序开的越多,电脑就会越卡,CPU占用率就会上升。但要用代码实现控制,就得在一个进程程序中完成。
CPU就像一堆砖,多个人可以搬完这堆砖(打开多个进程);一个人搬多点,也能搬完这堆砖(打开1个进程)。
那么就让进程程序在运行时,不断的去做事情(去搬砖),消耗CPU资源。
虽然我不知道如何达到50%,但可以先让CPU达到100%。

“++i;”简单的一行代码,如果重复1亿次,那么应该算是在不断的做事情。

所以第一次尝试是写了一段代码:

while (true)
{
    for (unsigned int i=0;i<36000000;++i){}		// 3600万次;
}

然后发现并没有什么卵用, 没实现cpu达到100 %,大概是在25%左右,而且感觉曲线波动和我运行的程序关系不大。
在这里插入图片描述
之后上网查资料:
CPU的运算速度,是和主频成正比关系的。一个大概的计算公式:运算次数=核数×主频×0.8,例如8核3.6ghz那么运算速度=8×3.6×0.8=23.04ghz。然后我把次数改为23亿次,发现也没什么效果。而且断点放开以后,下一次断点进入,要等好久时间,大约3秒。

while (true)     /// 没实现cpu达到100 %,
{
    for (unsigned int i=0;i<2300000000;++i){}	// 23亿次;
}

再后来查资料:
明白让一条线程死循环,对于8核16线程电脑来说,CPU并不能达到100%。要16线程全部死循环,CPU才达到满负载。于是我修改了代码,开了16条线程来跑,成功让CPU占用率达到100%(截这张图都卡了我一下)
在这里插入图片描述在这里插入图片描述
然后我想那我开8条线程,是不是就可以达到题目要求的50%了?
随后动手试了一下,但结果还是100%。 我擦,见鬼了,随后改成4条线程,发现变成70%了。
也就是说CPU的最大运算数和线程数、线程函数内计算量成正比关系。
但是公式怎么计算,我没推出来。
在这里插入图片描述
上网查资料:
有人写到对于多个CPU,开多个线程就可以控制CPU占用率曲线到50%。
虽然最终效果是达到了,但貌似还没具体领悟到真谛,觉得差了点什么。
在这里插入图片描述
CPU总计的曲线虽然可以控制在50%左右,但并没有让8个CPU都保持在50%,有可能是4个60%,4个40%,虽然8个总量的平均值是50%,但觉得不是我想要的效果。
该如何控制每个CPU都是正好是50%呢?

现在了解下来的是有好几种控制方法:

  1. 计算CPU的主频,然后循环++i的方式来实现,貌似是最下乘的武功,而且在多核CPU的电脑上,我压根就没准确的计算出这个值是多少,到底循环多少次可以达到50%。还是多核下,根本就行不通这种方法。
  2. 通过GetTickCount(),貌似也没有达到想象中的效果。
  3. 编程之美中还提到了一个工具:Perfmon.exe,啥玩意?继续研究下。。。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值