您的位置:首页 > 编程语言

编程之美 1.1 让CPU占用率曲线听你的指挥

2013-10-23 16:22 477 查看

编程之美 1.1 让CPU占用率曲线听你的指挥

本题是编程之美的第一题, 好的开始是成功的一半.
本文实现了"正弦曲线"的部分, 使用单核, CPU可以跑出一条正弦曲线.
算法的基本思想是:
首先计算正弦曲线的"busy time"和"idle time", 然后通过while()空循环Sleep()函数去控制忙和闲的部分, 最后观察CPU的变化.

代码(包含注释)
/*From Beauty of Programming, By C.L.Wang*/  /*编程之美1.1 让CPU占用率曲线听你的指挥*/  /*计算busy和idle的时间, 使用空循环和sleep()进行处理*/    #include "stdafx.h"    #include <iostream>  #include <cstdlib>  #include <cmath>    #include <windows.h>    const int SAMPLING_COUNT = 200; //抽样点数量  const double PI = 3.1415926535;  const int TOTAL_AMPLITUDE = 300; //整个振幅    int main(void){  	SetThreadAffinityMask(GetCurrentThread(), 1); //使用单核  	DWORD busySpan[SAMPLING_COUNT];  	int amplitude= TOTAL_AMPLITUDE/2; //振幅  	double radian= 0.0; //半径  	double radianIncrement = 2.0 / static_cast<double>(SAMPLING_COUNT); //半径增加量  	for(int i=0; i<SAMPLING_COUNT; i++){  		/*系统忙的时间在2倍振幅和0之间*/  		busySpan[i] = (DWORD)(amplitude+(sin(PI*radian)*amplitude));   		radian += radianIncrement; //振幅在0-2之间  		std::cout << "Busy Time: " << busySpan[i] << " "  			<< "Idle Time: " << TOTAL_AMPLITUDE-busySpan[i] << std::endl;  	}  	DWORD startTime = 0;  	/*无限循环, 忙用空循环, 空闲用sleep()*/  	for(int j=0; ; j=(j+1)%SAMPLING_COUNT){  		startTime = GetTickCount();  		while((GetTickCount()-startTime)<= busySpan[j])  //Busy  			;  		Sleep(TOTAL_AMPLITUDE-busySpan[j]); //Idle  	}  	return 0;  }




本文出自 “永不言弃” 博客,请务必保留此出处http://spikeking.blog.51cto.com/5252771/1388052
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: