一、控制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%呢?
现在了解下来的是有好几种控制方法:
- 计算CPU的主频,然后循环++i的方式来实现,貌似是最下乘的武功,而且在多核CPU的电脑上,我压根就没准确的计算出这个值是多少,到底循环多少次可以达到50%。还是多核下,根本就行不通这种方法。
- 通过GetTickCount(),貌似也没有达到想象中的效果。
- 编程之美中还提到了一个工具:Perfmon.exe,啥玩意?继续研究下。。。