通过编程控制CPU利用率

今天想起一个几年前学习过的程序,是在《编程之美》中提到的,是作为当时微软的面试题,写一个程序来控制CPU的利用率保持在50%,进一步延伸,能够写出程序来画出CPU利用率的正弦曲线。
这个题目看起来真是奇怪,能够达到这种程度,编程感觉就是出神入化了,但是仔细看看这个题目还是有一些依据可循,也有点小聪明的意思。
首先,对我们来说,能够直观感受CPU利用率就是通过任务管理器来得到的,我们可以大体的观察得到,基本上刷新CPU利用率的情况是按照秒来更新的,任何额外的操作都可能造成CPU的抖动,比如我打开另外一个程序,或者动动鼠标之类的。
所以在程序中,处理的时候CPU就开始忙起来了,如果想在一定的时间频度内给予CPU空闲时间,使得CPU利用率保持在50%,就代表
(CPU忙碌/(CPU忙碌+CPU空闲)=50%
从程序中来实现,CPU忙碌可以通过循环来实现,而空闲则可以通过sleep来实现。
关于这个实现,自己使用了如下的代码

点击(此处)折叠或打开

  1. public class CPUTest 
  2. { 
  3.     public static void main(String[] args) 
  4.     { 
  5.         long startTime = 0; 
  6.         int busyTime = 10; 
  7.         int idleTime = 10;
  8.         while (true) 
  9.         { 
  10.             startTime = System.currentTimeMillis(); 
  11.             while (System.currentTimeMillis() - startTime <= busyTime) 
  12.                 try 
  13.             { 
  14.                 Thread.sleep(idleTime); 
  15.             } 
  16.             catch (InterruptedException e) 
  17.             { 
  18.                 e.printStackTrace(); 
  19.               }
  20.         } 
  21.     }
  22. }
这个程序来本地的环境中测试,因为是多CPU的,所以得到的结果总是不太满意,没有达到预期,在单核的情况是没有问题的。
我灵机一动,可以通过Total CPU的使用率来说明。在任务管理器->性能 页面的右下角,有个资源监控的按钮,点进去就能看到一些详细的信息了。


得到了基本的要求,使得CPU利用率在50%左右,我们可以得到一个更为复杂的例子,就是画出正弦曲线来。
这个例子在本地测试基本得到了预期的效果。
使用的代码如下:

点击(此处)折叠或打开

  1. public class CPUTest
  2. {
  3.    
  4.     
  5.     public static void main(String[] args) throws Exception {
  6.         final double SPLIT = 0.01;
  7.         final int COUNT = (int) (2 / SPLIT);
  8.         final double PI = Math.PI;
  9.         final int INTERVAL = 200;
  10.         long[] busySpan = new long[COUNT];
  11.         long[] idleSpan = new long[COUNT];
  12.         int half = INTERVAL / 2;
  13.         double radian = 0.0;
  14.         for (int i = 0; i < COUNT; i++) {
  15.           busySpan[i] = (long) (half + (Math.sin(PI * radian) * half));
  16.           idleSpan[i] = INTERVAL - busySpan[i];
  17.           radian += SPLIT;
  18.         }
  19.         long startTime = 0;
  20.         int j = 0;
  21.         while (true) {
  22.           j = j % COUNT;
  23.           startTime = System.currentTimeMillis();
  24.           while (System.currentTimeMillis() - startTime < busySpan[j])
  25.             ;
  26.           Thread.sleep(idleSpan[j]);
  27.           j++;
  28.         }
  29.       }
  30. }
得到的图表如下,是不是有点味道。


可以通过这个例子看到,如果明白一些基本的知识点,结合实际还是能够得到很多意想不到的效果,学以致用在这个时候还是挺有趣的。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23718752/viewspace-1454146/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/23718752/viewspace-1454146/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值