編程之美1.1

解法一:簡單的解法

可以設置CPU的頻率和時間片的長度,計算循環的次數。因爲查看了計算機的屬性,發現處理器是雙核的,所以使用了SetThreadAffinityMask來綁定處理器,但是這個函數的兩個參數設置不是很清楚,是直接借鑑的【不明覺厲】

#include <windows.h>

void halfcpu();

int main(void){
	halfcpu();
}


//2.30GHz,2,300,000,000clk/s,執行一次循環爲5條指令,每個時鐘週期兩條指令
//每秒可以循環的次數:2,300,000,000*2/5=920,000,000次
//每10ms作爲一個時間片來輪流執行循環和sleep,10ms內執行循環次數爲9,200,000
void halfcpu(){
	int i;
	float cpuf=2.3;  //單位爲GHz
	int timeslot=10;    //時間片

	int looptime=(cpuf*1000000000*2/5)/(1000/timeslot);
	printf("%d\n",looptime);

	//雙核處理器,綁定一個處理器
	SetThreadAffinityMask(GetCurrentProcess(),0x00000001);

	for(;;)
	{
		for(i=0;i<9200000;i++);
		Sleep(10);
	}
	return;
}

但是上面打印出來looptime發現是9199999,和計算出來的9200000有誤差,考慮可能是因爲數據類型的原因。

32位的int正好可以到2.17G左右的最大值,這裏應該不會超出。【原因未知】

 

解法二:

//使用系統時鐘計數
void useTickCount()
{
	int timeslot;  //時間片長度	
	timeslot=10;  //設置爲10ms

	//雙核處理器,綁定一個處理器
	SetThreadAffinityMask(GetCurrentProcess(),0x00000001);

	while(TRUE)
	{
		DWORD startTime=GetTickCount();    //得到系統從啓動到現在經歷的毫秒值
		while((GetTickCount()-startTime)<timeslot);
		Sleep(timeslot);
	}
}


結果:

在進程中觀察到這個程序的cpu佔用率穩定在50:

性能:


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章