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

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

2013-10-23 16:22 441 查看

编程之美 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息