通过编程控制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++; 

 } 

 }
}

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

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

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2015-03-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏UDNZ

【译】Go 语言实践:编写可维护的程序的建议

本文为 QCon 2018 上海站主题演讲嘉宾、Heptio 资深工程师、著名 Go 语言专家 David Cheney 关于 Go 语言实践的英文分享。为方便...

52980
来自专栏文渊之博

SQL优化技巧--远程连接对象引起的CTE性能问题

背景    最近SSIS的开发过程中遇到几个问题。其中使用CTE时,遇到一个远程连接对象,结果导致严重的性能问题,为了应急我就修改了代码。   之前我写了一篇介...

19670
来自专栏哲学驱动设计

性能优化总结(二):聚合SQL

    本篇主要讲如何使用一句较复杂的SQL来加载整个聚合对象,以达到最小化数据库连接次数。主要是解释其中的原理。 LazyLoad及其缺点     相信越来越...

22060
来自专栏.net core新时代

数据字典生成工具之旅(2):数据字典生成工具及文档工具作用介绍

       上一篇介绍完了整个架构和功能,这一篇将更加详细介绍功能和操作,将会以实际例子帮助理解!(预告:下一篇正式进入实现原理讲解) 阅读目录 开始使用工具...

24350
来自专栏C/C++基础

CVTE2017秋季校招笔试题回忆(C++后台岗)

2016.09.06晚参加了CVTEC++岗的在线笔试。笔试题型分为不定向选择题和编程题,总共27题。其中不定项选择题为25道,编程题2道。其特点是不定项选择题...

12610
来自专栏文渊之博

理解和使用SQL Server中的并行

    许多有经验的数据库开发或者DBA都曾经头痛于并行查询计划,尤其在较老版本的数据库中(如sqlserver2000、oracle 7、mysql等)。但是...

28090
来自专栏james大数据架构

原生js写的贪吃蛇网页版游戏特效

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <body><title...

32150
来自专栏农夫安全

高级PHP应用程序漏洞审核技术【一】

前言 小编入门代码审计时看的几篇写的比较经典的PDF文档之一,分享出来希望能帮助到想学习代码审计的小伙伴。 [目录] 1. 前言 2. 传统的代码审计技...

524110
来自专栏PHP在线

2016最新面试题出炉

小编最近面试了一些公司,有上市公司也有创业公司,但是面试题都大同小异,小编凭记忆汇总了这些公司的面试题,希望对同行业的小伙伴有所帮助。

218100
来自专栏进击的程序猿

如何组织PHP中的异常

本文的主题是怎么组织php的异常?在大型项目中异常往往被我们忽略,但是如果前期没有很好的规划好,越到项目后期,重构的成本会越大。

17410

扫码关注云+社区

领取腾讯云代金券