通过编程控制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++;
}
}
}
得到的图表如下,是不是有点味道。
可以通过这个例子看到,如果明白一些基本的知识点,结合实际还是能够得到很多意想不到的效果,学以致用在这个时候还是挺有趣的。
- C++判断char*的指向
- Linux基础(day18)
- Spring Boot搭建Web应用
- 5.7 vim实践
- Effective Modern C++翻译(7)-条款6:当auto推导出意外的类型时,使用显式的类型初始化语义
- 2.3 ls命令
- Effective Modern C++翻译(6)-条款5:auto比显示的类型声明要更好
- 大白话-prototype属性
- Effective Modern C++翻译(5)-条款4:了解如何观察推导出的类型
- Effective Modern C++翻译(4)-条款3:了解decltype
- 大白话-constructor
- Effective Modern C++翻译(3)-条款2:明白auto类型推导
- React Native在Android平台运行gif的解决方法
- Effective Modern C++翻译(2)-条款1:明白模板类型推导
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PostgreSQL全局临时表插件pgtt的使用
- 首次在手机端不牺牲准确率实现BERT实时推理,比TensorFlow-Lite快近8倍,每帧只需45ms
- 【小白学PyTorch】7.最新版本torchvision.transforms常用API翻译与讲解
- 【SOT】siameseFC论文和代码解析
- 基于OpenCV创建视频会议虚拟背景
- 【算法】图文并茂,一文了解 8 种常见的数据结构
- 深度了解特征工程
- Nginx应用场景之虚拟主机
- shell tcping 端口,ping网段所有ip端口或tcping指定IP端口
- Redis | 源码阅读 —— 链表
- Python从入门到熟练(4):基础数据类型
- 【MaskTheFace】给人脸图片戴口罩!
- Python从入门到熟练(5): 数据类型进阶
- Python从入门到熟练(6): 流程控制
- Python包:json扩展包demjson使用