CPU占用率可理解为忙的时间与总的时间的比。若此,自然有第一种解法:空循环与Sleep。具体的方法和代码在《编程之美》的原著中有详述。须注意的是,测出CPU一秒钟能执行的空循环次数(假设能执行C次空循环)后,不能简单地空循环C/2次,然后休息半秒钟。这样得出的曲线虽然大致上是所要求的开头,但是抖动非常厉害。解决方法是什么呢?
解决方法就是使用更小的时间片。如果原来一秒钟可以做C次空循环,那么可以把它们同进降低两个数量级,先空循环C/100次,然后Sleep上10毫秒。这样得出的曲线就非常平滑了。这是对第一种方法的改进:使用更细的粒度实现更精准的模拟。
前两种方法都需要计算出电脑CPU一秒钟内能做多少次空循环。如果换一台电脑就必须重新计算这些数据。其实我们也能感觉得到,既然占用率是一个比值,比值总是相对的。如果我们要求CPU占用率50%,那么在一段时间里让CPU忙一半时间闲一半时间就可以了,这在任何地方都是对的。闲一段时间直接Sleep就可以,那么如何忙一段固定的时间呢?还是用空循环?如果在MSDN上查过clock这个函数,会发现MSDN上给出了一段示例代码如下:
这不正是使用空循环使CPU忙固定的时间吗?于是新的方法出来了,这种新的方法不需要具体的CPU参数,更加简单、灵巧、通用。下面是自己写的一个完整的让CPU占用率呈现正弦曲线的程序:
以上三种解法,解法三不但简单而且通用,其思想更值得学习。