解法一:简单的解法
可以设置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:
性能: