编程之美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:

《编程之美1.1》

性能:

《编程之美1.1》

 

 

    原文作者:tang05505622334
    原文地址: https://blog.csdn.net/tang05505622334/article/details/9319029
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞