抓住CPU使用率的特点:1秒更新一次,思路还是比较容易想的:让CPU1秒内的时间 一半在做空循环(一直忙),一半在sleep()。
我电脑配置: AMD 2.2GHz,及2.2*10^9个CPU时钟周期数/秒。
空循环: for(int i=0; i<n; i++);转换为最接近机器语言的汇编语言:
loop:
move dx,i
add dx
move i,dx
cmp i,n
jl loop
一个循环是5条指令
平均一个CPU时钟周期执行2条指令,则每秒可以执行的空循环次数为
2.2 *10^9 * 2 / 5 = 0.88 * 10^9
一个CPU调度时间片大概为10ms,10ms可以执行空循环0.88*10^7次,所以我们可以进行如下控制:
int main(){
while(1){
for(int i=0; i< 8800000;i++);//忙10ms
sleep(10);//歇10ms
}
}
然后再根据实际的CPU率来细微调整8800000的大小。运行后大概维持在35%左右,所以加大空循环的次数。最终调大6倍,至55000000时,CPU使用率才基本维持在50%左右。这可能是双核(AMD Athlon 64 X2 Dual 4200+)的影响,速度比理论的单核确实快了很多。
如图: