控制CUP占用率曲线
在《编程之美》上看过一道面试题就是要求:输出cup占用率的曲线图
今天看到了一篇文章就试试看看:
- #include <iostream>
- #include <cmath>
- #include <ctime>
- #include <windows.h>
- using namespace std;
- //得到循环0xFFFFFFFF次用的秒数
- unsigned int test()
- {
- unsigned int c = 0xFFFFFFFF;
- time_t t1, t2;
- time(&t1);
- for (unsigned int i = ; i < c; i++)
- ;
- time(&t2);
- return (unsigned int)(t2 - t1);
- }
- #define T 20000 //周期时间 20秒
- #define C 100 //采样点时间间隔
- #define PI 3.1415 //PI
- const unsigned int _count = 0xFFFFFFFF / (test() * ); //采样间隔可以执行的循环数目 //考虑到了当前系统的运行程序
- const unsigned int N = T / C; //周期内采样点数目
- unsigned int v[N] = { }; //所有采样点连续执行循环数
- unsigned int mt[N] = { }; //所有采样点休眠毫秒数
- int main()
- {
- //指定运行CPU
- SetThreadAffinityMask(GetCurrentThread(), );
- for (int i = ; i < N; i++)
- {
- double x = * PI * i / N;
- double r = (sin(x) + ) / ;
- mt[i] = C - r * C; //空闲时间
- v[i] = r * C * _count; //忙的时间,考虑当前cup使用情况
- }
- for (;;)
- {
- for (int i = ; i < N; i++)
- {
- for (int j = ; j < v[i]; j++)
- ;
- Sleep(mt[i]);
- }
- }
- }
实验结果:指定运行cup和核数有关吧
首先什么是CPU占用率?
在任务管理器的一个刷新周期内,CPU忙(执行应用程序)的时间和刷新周期总时间的比率,就是CPU的占用率,也就是说,任务管理器中显示的是每个刷新周期内CPU占用率的统计平均值。
因此可以写个程序,在一个刷新周期中,一会儿忙,一会儿闲,调节忙/闲比例,就可以控制CPU占有率!
题目:写一个程序,让用户来决定Windows任务管理器(Task Manager)的CPU占用率。程序越精简越好,计算机语言不限。例如,可以实现下面三种情况:
1. CPU的占用率固定在50%,为一条直线;
2. CPU的占用率为一条直线,但是具体占用率由命令行参数决定(参数范围1~ 100);
3. CPU的占用率状态是一个正弦曲线。
直线cpu:使x=0即可:
- #include <iostream>
- #include <cmath>
- #include <ctime>
- #include <windows.h>
- using namespace std;
- //得到循环0xFFFFFFFF次用的秒数
- unsigned int test()
- {
- unsigned int c = 0xFFFFFFFF;
- time_t t1, t2;
- time(&t1);
- for (unsigned int i = ; i < c; i++)
- ;
- time(&t2);
- return (unsigned int)(t2 - t1);
- }
- #define T 20000 //周期时间 20秒
- #define C 100 //采样点时间间隔
- #define PI 3.1415 //PI
- const unsigned int _count = 0xFFFFFFFF / (test() * ); //采样间隔可以执行的循环数目
- const unsigned int N = T / C; //周期内采样点数目
- unsigned int v[N] = { }; //所有采样点连续执行循环数
- unsigned int mt[N] = { }; //所有采样点休眠毫秒数
- int main()
- {
- //指定运行CPU
- SetThreadAffinityMask(GetCurrentThread(), );
- ////正弦cpu
- //for (int i = 0; i < N; i++)
- //{
- // double x = 2 * PI * i / N;
- // double r = (sin(x) + 1) / 2;
- // mt[i] = C - r * C;
- // v[i] = r * C * _count;
- //}
- //for (;;)
- //{
- // for (int i = 0; i < N; i++)
- // {
- // for (int j = 0; j < v[i]; j++)
- // ;
- // Sleep(mt[i]);
- // }
- //}
- //直线cpu
- for (int i = ; i < N; i++)
- {
- double x = * PI * i / N;
- x = ;
- double r = (sin(x) + ) / ;
- mt[i] = C - r * C;
- v[i] = r * C * _count;
- }
- for (;;)
- {
- for (int i = ; i < N; i++)
- {
- for (int j = ; j < v[i]; j++)
- ;
- Sleep(mt[i]);
- }
- }
- }
- //没有考虑现在系统cpu使用情况
- //#include <windows.h>
- //#include <math.h>
- //int main(void)
- //{
- // SetThreadAffinityMask(GetCurrentProcess(), 1);
- // const double SPLIT = 0.01;
- // const int COUNT = 200;
- // const double PI = 3.14159265;
- // const int INTERVAL = 300;
- // DWORD busySpan[COUNT]; //array of busy time
- // DWORD idleSpan[COUNT]; //array of idle time
- // int half = INTERVAL / 2;
- // double radian = 0.0;
- // for (int i = 0; i < COUNT; i++)
- // {
- // busySpan[i] = (DWORD)(half + (sin(PI*radian)*half));
- // idleSpan[i] = INTERVAL - busySpan[i];
- // radian += SPLIT;
- // }
- // DWORD startTime = 0;
- // int j = 0;
- // while (true)
- // {
- // j = j%COUNT;
- // startTime = GetTickCount();
- // while ((GetTickCount() - startTime) <= busySpan[j])
- // ;
- // Sleep(idleSpan[j]);
- // j++;
- // }
- // return 0;
- //}
结果:
reference:
控制CUP占用率曲线的更多相关文章
- 控制CPU占用率曲线
编程之美的第一个问题,我的机器是双核的,用文中的代码,得到的曲线波动比较大额,受其他进程的影响比较大.文中提到10ms接近windows的调度时间片,如果选得太小,会造成线程被频繁唤醒和挂起,造成内核 ...
- 编程之美读书笔记1.1——让CPU占用率曲线听你的指挥
http://blog.csdn.net/pipisorry/article/details/36189155 <strong><span style="font-size ...
- 编程之美_1.1 让CPU占用率曲线听你指挥
听到有人说让要写一个程序,让用户来决定Windows任务管理器的CPU占用率. 觉得很好奇.但第一个想法就是写个死循环.哈哈.不知道具体的占用率是多少,但至少能保证在程序运行时,CPU的占用率终会稳定 ...
- 让cpu占用率曲线听你指挥(多核处理器)
编程之美 1.1 让cpu占用率曲线听你指挥(多核处理器) [版权声明]转载请注明出处 http://www.cnblogs.com/TenosDoIt/p/3242910.html [目录] 不考 ...
- 第1章 游戏之乐——让CPU占用率曲线听你指挥
让CPU占用率曲线听你指挥 写一个程序,让用于来决定Windows任务管理器(Task Manager)的CPU占用率.程序越精简越好,计算机语言不限.例如,可以实现下面三种情况: CPU的占用率固定 ...
- JVM CUP占用率过高排除方法,windows环境
jdk自带的jvisualvm可以看到程序CPU使用率,但是无法确定具体的线程,想要确定到具体的线程需要借用到微软的Process Explorer 具体排除方法: 一:打开资源管理器,找到cup占用 ...
- 1.1 让CPU占用率曲线听你指挥[cpu manager]
[本文链接] http://www.cnblogs.com/hellogiser/p/cpu-manager.html [题目] 写一个程序,让用户来决定Windows任务管理器(Task Manag ...
- 编程之美 1.1 让cpu占用率曲线听你指挥(多核处理器)
[目录] 不考虑其他进程,cpu画正弦曲线 获取总体cpu利用率 获取多核处理器单个cpu利用率 考虑其他进程,cpu画正弦曲线 下面的程序针对多核处理器,可以设置让任何一个cpu显示相应的曲线(本文 ...
- 让CPU占用率曲线听你指挥
使用GetTickCount()和Sleep(): Code#include <stdio.h> #include <unistd.h> #include <time.h ...
随机推荐
- docker容器utf-8编码问题
locale -a export LANG=C.UTF-8 locale 在docker容器中python脚本汉字的会乱码 按照上面的方法暂时的设置下容器 编码可以解决脚本中文乱码问题
- luogu3389 【模板】高斯消元法
#include <algorithm> #include <iostream> #include <cstdio> #include <cmath> ...
- java append方法
JAVA 中 Stringbuffer 有append()方法 Stringbuffer其实是动态字符串数组 append()是往动态字符串数组添加,跟“xxxx”+“yyyy”相当那个‘+’号 ...
- 浅析win32 Win64 x86 x64 区别 及Eclipse启动报Java was started but returned exit code=13 错误
win32.x86_64是64位 X86就是 32位系统 X64 就是64位系统 最好记得方法就是带有64的就是64位,其余都是32位 为什么要讲这个呢? 如果是绿色版本的eclipse,在打开ec ...
- 网络流(自行理解的Dinic)
自行理解的Dinic 注释即讲解 #include<bits/stdc++.h> ; using namespace std; int read() { ,w=; ;ch=getchar( ...
- 解决 Could not load hsdis-amd64.dll
win10下想查看JIT编译的汇编源码 结果提示: Could not load hsdis-amd64.dll; library not loadable; PrintAssembly is dis ...
- 【前端学习笔记】2015-09-06 ~~~~ setAttribute()、slice()
所遇记录: 1.setAttribute("属性",value),相同的还有addAttribute("属性名",value),getAttribute(“属性 ...
- bzoj 4184 shallot 时间线建线段树+vector+线性基
题目大意 n个时间点 每个时间点可以插入一个权值或删除一个权值 求每个时间点结束后异或最大值 分析 异或最大值用线性基 但是线性基并不支持删除操作 我们可以对时间线建一棵线段树 离线搞出每个权值出现的 ...
- poj 4001 To Miss Our Children Time
To Miss Our Children Time Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65768/65768 K (Jav ...
- JavaWeb学习总结(十七)——JSP中的九个内置对象(转)
一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...