今天开始接触到编程之美这本书
书的一开始就讲到一个问题,怎样让自己的CPU使用率保持在50%,真是个让人匪夷所思的问题不是么
这里简单的介绍一下我的电脑 ThinkpadE420 普通的办公本 i5-2430处理器 双核四线程
对于单核单线程的电脑而言,当我们写入一个死循环的时候,CPU占用率会直接飙升到100%
而对于双核四线程而言,一个死循环会使得CPU占用率到达25%
也很容易理解,就是相当于把100%分成一个四分
所以这里最简单实现CPU占用率100%的途径就是跑两个死循环,这时候就会出现锯齿波动的cpu 50%图 如下所示
public class CPUTest {
public static void main(String[] args) {
int busyTime = 10;
int idleTime = busyTime;
long startTime = 0;
new Thread(new Runnable() {
@Override
public void run() {
while(true) {
}
}
}).start();
while (true) {
}
}
}
当然这不是一个很好的方式,不能适应CPU的变化
下面我们用另一种方式来模拟CPU占用率12.5%的情况,因为我的电脑是双核四线程,我们把25%看做一个单独的电脑,12.5%就是其中的50%
在java 中有 System.currentTimeMillis()用来获取开机到当前时间经过的毫秒数,对应C 中 GetTickCount方法
windows调度时间片约为10ms,为了达到50%的目的,我们让cpu在这个10ms执行空操作,下个10ms睡眠,这样就达到了50%的目的
public class CPUTest {
public static void main(String[] args) {
int busyTime = 10;
int idleTime = busyTime;
long startTime = 0;
while(true) {
startTime = System.currentTimeMillis();
while(System.currentTimeMillis() - startTime <= busyTime) {
}
try {
Thread.sleep(10);
}catch(Exception e) {
e.printStackTrace();
}
}
}
}
由于在电脑中还存在后台程序的运行,所以存在有一定的波动性,但是大体上数据是正确的
怎样处理这样的问题呢 暂时我还没想到好的解决方案,C#中有性能监视器类可以实现这样的结果