通过编程控制CPU利用率(r4笔记第69天)

时间:2022-05-04
本文章向大家介绍通过编程控制CPU利用率(r4笔记第69天),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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

public class CPUTest 

{ 

 public static void main(String[] args) 

 { 

 long startTime = 0; 

 int busyTime = 10; 

 int idleTime = 10;

 while (true) 

 { 

            startTime = System.currentTimeMillis(); 

 while (System.currentTimeMillis() - startTime <= busyTime) 

 try 

 { 

 Thread.sleep(idleTime); 

 } 

 catch (InterruptedException e) 

 { 

                e.printStackTrace(); 

 }

 } 

 }
}

这个程序来本地的环境中测试,因为是多CPU的,所以得到的结果总是不太满意,没有达到预期,在单核的情况是没有问题的。 我灵机一动,可以通过Total CPU的使用率来说明。在任务管理器->性能 页面的右下角,有个资源监控的按钮,点进去就能看到一些详细的信息了。

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

public class CPUTest 

{ 

 

 

 public static void main(String[] args) throws Exception { 

 final double SPLIT = 0.01; 

 final int COUNT = (int) (2 / SPLIT); 

 final double PI = Math.PI; 

 final int INTERVAL = 200; 

 long[] busySpan = new long[COUNT]; 

 long[] idleSpan = new long[COUNT]; 

 int half = INTERVAL / 2; 

 double radian = 0.0; 

 for (int i = 0; i < COUNT; i++) { 

          busySpan[i] = (long) (half + (Math.sin(PI * radian) * half)); 

          idleSpan[i] = INTERVAL - busySpan[i]; 

          radian += SPLIT; 

 } 

 long startTime = 0; 

 int j = 0; 

 while (true) { 

          j = j % COUNT; 

          startTime = System.currentTimeMillis(); 

 while (System.currentTimeMillis() - startTime < busySpan[j]) 

 ; 

 Thread.sleep(idleSpan[j]); 

          j++; 

 } 

 }
}

得到的图表如下,是不是有点味道。

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