当前位置: 首页 > news >正文

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

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

public class CPUTest

  1. {

  2. public static void main(String[] args)

  3. {

  4. long startTime = 0;

  5. int busyTime = 10;

  6. int idleTime = 10;

  7. while (true)

  8. {

  9. startTime = System.currentTimeMillis();

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

  11. try

  12. {

  13. Thread.sleep(idleTime);

  14. }

  15. catch (InterruptedException e)

  16. {

  17. e.printStackTrace();

  18. }

  19. }

  20. }

  21. }

这个程序来本地的环境中测试,因为是多CPU的,所以得到的结果总是不太满意,没有达到预期,在单核的情况是没有问题的。我灵机一动,可以通过Total CPU的使用率来说明。在任务管理器->性能 页面的右下角,有个资源监控的按钮,点进去就能看到一些详细的信息了。0得到了基本的要求,使得CPU利用率在50%左右,我们可以得到一个更为复杂的例子,就是画出正弦曲线来。这个例子在本地测试基本得到了预期的效果。使用的代码如下:

public class CPUTest

  1. {

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

  3. final double SPLIT = 0.01;

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

  5. final double PI = Math.PI;

  6. final int INTERVAL = 200;

  7. long[] busySpan = new long[COUNT];

  8. long[] idleSpan = new long[COUNT];

  9. int half = INTERVAL / 2;

  10. double radian = 0.0;

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

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

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

  14. radian += SPLIT;

  15. }

  16. long startTime = 0;

  17. int j = 0;

  18. while (true) {

  19. j = j % COUNT;

  20. startTime = System.currentTimeMillis();

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

  22. ;

  23. Thread.sleep(idleSpan[j]);

  24. j++;

  25. }

  26. }

  27. }

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

相关文章:

  • 通过图表简化sql语句的表关联(r4笔记第70天)
  • 巧用外部表避免大量的insert (r4笔记第71天)
  • 海量数据迁移之数据抽取流程 (r4笔记第72天)
  • 重温快速排序(r4笔记第73天)
  • 海量数据迁移之sqlldr和datapump的缺点分析(r4笔记第74天)
  • mongoDB初探第一篇(r4笔记第75天)
  • 通过单例模式模拟RAC连接 (r4笔记第76天)
  • 特殊的物化视图刷新 (r4笔记第77天)
  • 总结nmon的诸多优点 (r4笔记第78天)
  • 不要成为技术的奴隶(二) (r4笔记第79天)
  • 清华梦的粉碎读后感--论理想主义者王垠(r4笔记第80天)
  • 浅谈Hadoop (r4笔记第81天)
  • MongoDB初探第二篇 (r4笔记第82天)
  • 大话UML中类之间的关系 (r4笔记第83天)
  • 关于Oracle的技术问答 (r4笔记第85天)
  • Angular 4.x 动态创建组件
  • Debian下无root权限使用Python访问Oracle
  • golang中接口赋值与方法集
  • java 多线程基础, 我觉得还是有必要看看的
  • JavaScript 一些 DOM 的知识点
  • python 学习笔记 - Queue Pipes,进程间通讯
  • QQ浏览器x5内核的兼容性问题
  • uva 10370 Above Average
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • 闭包,sync使用细节
  • 浮现式设计
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 记录:CentOS7.2配置LNMP环境记录
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 前端知识点整理(待续)
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 延迟脚本的方式
  • 再谈express与koa的对比
  • 在weex里面使用chart图表
  • 06-01 点餐小程序前台界面搭建
  • ionic入门之数据绑定显示-1
  • 如何正确理解,内页权重高于首页?
  • ​2021半年盘点,不想你错过的重磅新书
  • # .NET Framework中使用命名管道进行进程间通信
  • ###STL(标准模板库)
  • (1)SpringCloud 整合Python
  • (C语言)字符分类函数
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (六)激光线扫描-三维重建
  • (十)c52学习之旅-定时器实验
  • (四)鸿鹄云架构一服务注册中心
  • (四)汇编语言——简单程序
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • .net core 依赖注入的基本用发
  • .NET 事件模型教程(二)