解法一:簡單的解法
可以設置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:
性能: