编程之美学习笔记(一)-让CPU占用率曲线听你指挥

终于放假了,开始在家里看一本向同学借来被程序猿尊称的必看经典书之一---《编程之美》。这本书给我的第一感觉是,他不单单是一本介绍算法的书,更不是一本纯算法的书,更多的是跟生活的很多实际问题息息相关,让你能更多地思考当我们面对现实实际问题的时候如何用自己从之前书本学习到的理论的知识去解决他们,如何以理论联系实际。这个寒假都会更新从这本书中学习来的知识,也希望有相同兴趣的人可以一起共同交流。那么就开始进入正题吧。

如何让cpu占用率呈现直线或者正弦曲线呢,看完第一章节,最简单的无非是调整自己写的程序运行与沉睡的时间比例。对于直线,这个比列是恒定不变的,对于正弦曲线,比例如同正弦函数值一样变化即可。但是感觉这个方法很搓,因为整台电脑中并不仅仅只有自己写的程序在运行,所以用这种方法只有直线或者正弦曲线的雏形,不平滑,看起来也不好看。代码呢如下,暂时只学了这种很搓的办法,等之后再更新更好的方法吧。

#include<iostream>
#include<windows.h>
#include<cmath>
#include<cstdlib>

using namespace std;

const DWORD busyTime = 10;
const DWORD idleTime = busyTime;

const int SAMPLE_COUNT = 2000;		//抽样点个数
const double PI = 3.1415926535;
const int TOTAL_AMPLITUDE = 10000;	//每个抽样点对应的时间片

void cpuLine1();
void cpuLine2();
void cpuSinCurve();

int main()
{
	//cpuLine1();
	//cpuLine2();
	cpuSinCurve();

	return 0;
}

void cpuLine1()
{
	for(;;)
	{
		for(int i = 0;i < 9600000;++i)
			;
		Sleep(10);
	}
}

void cpuLine2()
{
	INT64 startTime = 0;
	while(1)
	{
		DWORD startTime = GetTickCount();
		while((GetTickCount() - startTime) <= busyTime)
			;
		Sleep(idleTime);
	}
}

void cpuSinCurve()
{
	DWORD busySpan[SAMPLE_COUNT];
	int amplitude = TOTAL_AMPLITUDE / 2 ;
	double radian = 0.0;
	double radianIncrement = 2 / SAMPLE_COUNT;  //抽样弧度增量
	for(int i = 0;i < SAMPLE_COUNT; ++i)
	{
		busySpan[i] = (DWORD)(amplitude + amplitude *  sin(radian * PI));
		radian += radianIncrement;
	}

	DWORD startTime = 0;
	while(1)
	{
		for(int i = 0;i < SAMPLE_COUNT;++i)
		{
			startTime = GetTickCount();
			while((GetTickCount() - startTime) <= busySpan[i])
				;
			Sleep(TOTAL_AMPLITUDE-busySpan[i]);
		}
	}

}
时间: 2024-10-06 11:44:29

编程之美学习笔记(一)-让CPU占用率曲线听你指挥的相关文章

1.1 让CPU占用率曲线听你指挥[cpu manager]

[本文链接] http://www.cnblogs.com/hellogiser/p/cpu-manager.html [题目] 写一个程序,让用户来决定Windows任务管理器(Task Manager)的CPU占用率.程序越精简越好,计算机语言不限.例如,可以实现下面三种情况: 1.    CPU的占用率固定在50%,为一条直线: 2.    CPU的占用率为一条直线,但是具体占用率由命令行参数决定(参数范围1~ 100): 3.    CPU的占用率状态是一个正弦曲线. [分析] 如果不考

编程之美读书笔记1.1——让CPU占用率曲线听你的指挥

http://blog.csdn.net/pipisorry/article/details/36189155 <strong><span style="font-size:48px;color:#ff0000;">问题:</span></strong>写一个程序,让用户来决定Windows任务管理器(Task Manager)的CPU占用率. 假设机器是多CPU,上面的程序会出现什么结果?怎样在多个CPU时显示相同的状态?比如.在双核的

cpu占用率曲线-笔记

我们知道要查看电脑的cpu占用率的话可以从任务管理器得知,进一步可以从->性能栏 看到CPU占用率的曲线的变化.今天看了编程之美的第一章第一节,看到对电脑cpu占用率的控制,控制CPU占用率曲线变化,达到特定的效果. cpu占用率曲线的刷新频率为1秒.要使在某一时刻CPU占用率达到目的中的百分比,可通过分配1秒内程序运行和休眠的时间的所占比,来达到.如在某1秒内,程序都处于休眠状态,那么,CPU占用率将达到0(理想化).反正,cpu占用率将达到100%. 第一种方法:基于计算程序所运行的电脑CP

让CPU的占有率曲线听我指挥

最近我要在公司的一个study group负责AWS的AutoScaling功能的介绍.AWS可以根据instance(虚拟机)的CPU使用量进行scaling. 为了做demo,于是就有这样一个需求:让instance上的CPU听我指挥,当然简单的方法就是写一个死循环,让CPU 100%.但如果make things more interesting,希望实现CPU在某个范围内变化又要怎么做哩? 之前看过,邹欣大神的书<编程之美>,其中第一个问题就是“让CPU占有率曲线听你指挥”,里面提到了

编程之美学习笔记之 一摞烙饼的排序

编程之美书中讲的一摞烙饼的排序一题 这里无法用基本的排序方法对其排序,那么最直接的方法是找出N个数种最大者,将这通过两次翻转放置到最底部,然后处理N-1,N-2等,直到全部排序完,所以一共需要交换2(N-1)次 void reverse(int cakes[], int beg, int end) { int temp; while(beg < end){ temp = cakes[beg]; cakes[beg++] = cakes[end]; cakes[end--] = temp; } }

【编程之美学习笔记】2.1求二进制数中1的个数

问题:对于一个字节(8bit)的无符号整型变量,求其二进制表示中“1”的个数,要求算法的执行效率尽可能高. 解法一:除.余操作 我们知道,对于二进制操作,除以一个2,原来的数字将会减少一个0,如果除的过程中有余,那么就表示当前位置有一个1,所以可通过相除和判断余数的值来分析. [时间复杂度O(log2v),log2v为二进制数的位数,空间复杂度O(1)] 1 int Count(int v){ 2 int num = 0; 3 while(v){ 4 if(v % 2 == 1) num++;

【编程之美学习笔记】2.2不要被阶乘吓到

我好饿吖, 为什么我现在在教室闻到了饭香味... 问题1.给定一个整数N,那么N的阶乘N!末尾有多少个0呢?例如:N=10,N=3 628 800, N!的末尾有两个0. (好巧吖,昨天做的51nod 1003就是这个题,来分析一下吧!) 看到这题,你想完整计算N!的值吗?那可能溢出哦.其实这个问题只要从“哪些数相乘能得到10”这个角度考虑就简单啦. 首先,如果N!=k * 10^M, 且K不能被10整除,那么N!的末尾有M个0.再对N!进行质因数分解,N!=(2^X)*(3^Y)*(5^Z)…

编程之美 之 让CPU占用率听你指挥

昨天在bbs上淘到了这本编程之美.顺手刷了第一章,很有意思.第一章的要求是要控制CPU曲线,绘制出对应的形状. 拿到这个问题,我的第一反应是, 是不是有这么一个API,能在任务管理器上的对应区域直接绘制图形呢? 然后就去查找API, 可惜搜索能力不行,最终还是没有找到. 然后看书上的解释, 太棒了. 解决这道题目的核心是. CPU占用率的概念,应该是指 CPU忙的时间与总时间的比,他是一个平均值的概念.也就是说.通过控制CPU忙闲时间的比值,我们能够大致控制CPU的占用率. 通过这个思想能够 控

《编程之美》学习笔记——指挥CPU占用率

问题: 写一个程序,让用户来决定Windows任务管理器(Task Manager)的CPU占用率(单核).有以下几种情况: 1.CPU占用率固定在50%,为一条直线 2.CPU的占用率为一条直线,具体占用率由命令行参数决定(范围1~100) 3.CPU的占用率状态为一条正弦曲线 4.多核处理器情况下上述问题怎么解决 分析与解答 首先确定CPU占用率的定义,即在任务管理器的一个刷新周期内,CPU忙(执行应用程序)的时间和刷新周期总时间的比率,就是CPU的占用率,也可以说成,任务管理器中显示的是每