在任务管理器的一个刷新周期内,CPU忙碌(执行应用程序)的时间和刷新周期总时间的比率,就是CPU的忙碌率。即,任务管理器中显示的是每个刷新周期内CPU占用率的平均值。通过调节CPU忙/闲的比例,就可以实现控制任务管理器中显示的CPU占用率。
GetTickcount函数:它返回从操作系统启动到当前所经过的毫秒数,常常用来判断某个方法执行的时间,其函数原型是DWORD GetTickCount(void),返回值以32位的双字类型DWORD存储,因此可以存储的最大值是2^32 ms约为49.71天,因此若系统运行时间超过49.71天时,这个数就会归0,MSDN中也明确的提到了:"Retrieves the number of milliseconds that have elapsed since the system was started, up to 49.7 days."。因此,如果是编写服务器端程序,此处一定要万分注意,避免引起意外的状况。
单核情况:
1>. 50%忙碌率:
#include <iostream> #include <Windows.h> using namespace std; int main() { const DWORD busyTime = 100; const DWORD idleTime = busyTime; LONG64 startTime = 0; while(true) { //GetTickCount返回从操作系统启动到现在所经过的毫秒数,返回值是DWORD。 DWORD startTime = GetTickCount(); //busy loop while((GetTickCount() - startTime) <= busyTime) ; //idle loop Sleep(idleTime); } return 0; }
2> .正弦曲线:
#include <iostream> #include <Windows.h> using namespace std; //把一条正弦曲线0~2π之间的弧度等分为200份进行抽样,计算每个抽样点的振幅、 //然后每隔300ms的时间取下一个抽样点,并让cpu工作对应振幅的时间 const int SAMPLING_COUNT = 200;//抽样点数量 const double PI = 3.1415926535;//π值 const int TOTAL_AMPLITUDE = 300;//每个抽样点对应的时间片 int main() { DWORD busySpan[SAMPLING_COUNT];//忙碌时间跨度 int amplitude = TOTAL_AMPLITUDE / 2;//设置振幅为150 double radian = 0.0;//初始化弧度为0.0 double radianIncrement= 2.0 / (double)SAMPLING_COUNT;//设置弧度增量 for (int i = 0;i < SAMPLING_COUNT;++i) { busySpan[i] = (DWORD)(amplitude + sin(PI * radianIncrement * i) * amplitude); } for (int j = 0;;j = (j + 1) % SAMPLING_COUNT) { DWORD startTime = GetTickCount(); while ((GetTickCount() - startTime) <= busySpan[j]) ; Sleep(TOTAL_AMPLITUDE - busySpan[j]); } return 0; }
参考:http://www.cnblogs.com/growup/archive/2012/03/13/2394783.html,http://cooker.iteye.com/blog/652604
#include <windows.h> #include <string> #include <iostream> using namespace std; void running(int seconds) { Sleep(seconds*1000); cout<<"sleep for "<<seconds<<"(s)"<<endl; } int main() { SetThreadAffinityMask(GetCurrentThread(), 1); LARGE_INTEGER start, end; LARGE_INTEGER freq; //timeConsuming(); QueryPerformanceFrequency(&freq); cout << "freq.QuadPart:" << freq.QuadPart << endl; QueryPerformanceCounter(&start);//start cout<<"start.QuadPart = "<<start.QuadPart<<endl;//output start running(3); //running 3 seconds QueryPerformanceCounter(&end); //end cout<<"end.QuadPart = "<<end.QuadPart<<endl; //output end cout<<"consume value = end.QuadPart - start.QuadPart = "<<(end.QuadPart - start.QuadPart)<<endl; //利用两次获得的计数之差和时钟频率,计算出事件经历的精确时间 cout<<"(consume value/(double)freq.QuadPart) Time consumed = "<< (end.QuadPart - start.QuadPart)/(double)freq.QuadPart<<"(s)"<<endl; //output consumed time return 0; }