博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第1章 游戏之乐——让CPU占用率曲线听你指挥
阅读量:4864 次
发布时间:2019-06-11

本文共 3027 字,大约阅读时间需要 10 分钟。

让CPU占用率曲线听你指挥

写一个程序,让用于来决定Windows任务管理器(Task Manager)的CPU占用率。程序越精简越好,计算机语言不限。例如,可以实现下面三种情况:

  1. CPU的占用率固定在50%,为一条直线;
  2. CPU的占用率为一条直线,但是具体占用率由命令行参数决定(参数范围1~100);
  3. CPU的占用率状态是一个正弦曲线。

【解法一】 简单的解法

  一个空的for循环for(int i=0;i<n;i++); 写成汇编代码后进行分析:

loop:mov dx i  ;将i置入dx寄存器inc   dx    ;将dx从寄存器加1mov i  dx ;将dx中的值赋回icmp i  n   ;比较i和njl    loop  ; i小于n时则重复循环

需要执行5条代码,假设要运行的CPU是2.66Ghz(2.66*10^9个时钟周期每秒)。现在CPU每个时钟周期可以执行两条以上的代码,那么我们就取平均值两条,于是让(2660000000*2)/5=1064000000(循环/秒),如果让CPU工作1秒钟,然后休息1秒钟,波形很可能就是锯齿状的——先达到一个峰值(>50%),然后跌到一个很低的占用率。

于是尝试降两个数量级。用10ms是因为它不大不小,比较接近Windows的调度时间片。如果太小会造成线程频繁被唤醒和挂起,无形中增加了内核时间的不确定性影响。最后我们得到如下代码:

package chapter1youxizhile;/** * 【解法一】简单的方法 * 运行的CPU是2.66Ghz(2.66*10^9个时钟周期每秒) * @author DELL * */public class ControlCPU1 {    public static void main(String[] args) {        for( ; ; ){            for(int i=0;i<10640000;i++);  //运行10ms            try {                Thread.sleep(10);  //休眠10ms            } catch (InterruptedException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }    }}

  在不断调整10640000后,我们就可以在一台指定的机器上获得一条大致稳定的50%CPU占用率直线。

【解法二】使用System.currentTimeMillis()和Thread.sleep()

package chapter1youxizhile;/** * 【解法二】使用System.currentTimeMillis()和Thread.sleep() * 运行的CPU是2.66Ghz(2.66*10^9个时钟周期每秒) * @author DELL * */public class CopyOfControlCPU2 {        public static void main(String[] args) {        int busyTime = 10;  //繁忙时间10ms        int idleTime = busyTime;  //空闲时间        while(true){            long startTime = System.currentTimeMillis(); //获取系统运行时间            while(System.currentTimeMillis()-startTime<= busyTime) ;            try {                Thread.sleep(idleTime);            } catch (InterruptedException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }    }}

 效果如下:

  这两种解法都是假设目前系统上只有当前程序在运行,但实际上,操作系统中有很多程序会同时执行各种各样的任务,如果此刻其他进程使用了10%的CPU,那么我们的程序应该只能使用40%的CPU,这样才能达到50%的效果。

  怎么做呢?这就需要用到另个工具的帮忙——Perform.exe。如下图所示:

  我们可以写程序来查询Perform的值,Mircrosoft .Net Framework提供了PerformanceCounter这一对象,可以方便地得到当前各种性能的数据,包括CPU的使用率。例如下面这个程序:

 【解法三】能动态适应的解法

//C# codestatic void MakeUsage(float level){    PerformanceCounter p = new PerformanceCounter("Processor", "% Processor Time", "_Total");    while(true)    {        if(p.NextValue()>level)            System.Threading.Thread.Sleep(10);    }}

  可以看到,上面的解法能方便地处理各种CPU使用率的参数。这个程序可以解答前面提到的问题2。

【解法四】正弦曲线

package chapter1youxizhile;/** * 【解法四】正弦曲线 * @author DELL * */public class CopyOfCopyOfControlCPU4 {    static final double SPLIT = 0.01;  //2PI周期步长    static final int COUNT = 200;  //取点个数    static final double PI = 3.1415926;    static final int INTERVAL = 300;  //空闲和繁忙的总时间    public static void main(String[] args) {        long busySpan[];  //CPU繁忙时间的数组        long idleSpan[];  //CPU空闲时间的数组        busySpan = new long[COUNT];        idleSpan = new long[COUNT];        int half = INTERVAL/2;        double radian = 0.0;        for(int i=0;i

程序运行后任务管理器效果如下:

转载于:https://www.cnblogs.com/gaopeng527/p/4598073.html

你可能感兴趣的文章
购物车
查看>>
关于特效表现与资源优化
查看>>
JAVA String.format 方法使用介绍
查看>>
接口测试案例设计
查看>>
模块和包
查看>>
GC.Collect
查看>>
Linux sz rz
查看>>
centos7.1下 Docker环境搭建
查看>>
c# 导出Excel
查看>>
Status: Checked in and viewable by authorized users 出现在sharepoint 2013 home 页面
查看>>
ubuntu14.04 安装tensorflow始末
查看>>
Orale查询返回相似度基数个数
查看>>
python数据预处理
查看>>
Python之路,Day21 - 常用算法学习
查看>>
Android安全-代码安全1-ProGuard混淆处理
查看>>
部署core
查看>>
mysql 时间设置
查看>>
如何在 Xcode 中修改应用的名字
查看>>
[BZOJ5334][TJOI2018]数学计算(exgcd/线段树)
查看>>
[BZOJ4340][BJOI2015]隐身术(后缀数组)
查看>>