欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]精密计时器的使用

[原创]精密计时器的使用

最近想测试一下自己写的函数效率如何,所以就研究了一下计时器的实现方法,发现,要实现精密计时,主要有两种方法,一种是VC内嵌汇编,另一种是api,下面是我实现的代码,如果有需要的朋友可以直接copy.
但是在程序实际运行的时候两种计时方式得出的数据不一致,如果有哪位大虾看出哪里有bug,请狂喷
此程序运行结果为:汇编测得的两种方法时间相差无几,但奇怪的是使用数组方法居然比vector要慢,更奇怪的是使用api的方法得出的结果vector使用的时间竟然达到了数组的8倍之多
此前我还做过一个实验,单独使用汇编测定时间,vector所用的时间也会达到数组的几倍,而不是此程序里的结果
这些问题让我百思不得其解


                #define u32 unsigned _int32

                #define u64 unsigned _int64

void main()

{

	_wsetlocale(LC_ALL, L"chs");

	/*************************************************************************************************************************/

	//以下是汇编计时方法

	//vectgor计时第一次

	BIT64 m1,m2,m3,m4,m5,m6;

	_asm

	{

		RDTSC

		mov dword ptr[m1],EAX

		mov dword ptr[m1 + 4],EDX

	}

	/*************************************************************/

	//函数体

	std::vector<u32> v1(100000000);

	u32 i = 0;

	while(i < 100000000)

	{

		v1[i] = i;

		i++;

	}

	/*************************************************************/

	//vector第二次计时

	_asm

	{

		RDTSC

		mov dword ptr[m2],EAX

		mov dword ptr[m2 + 4],EDX

	}

	/*************************************************************/

	//array第一次计时

	_asm

	{

		RDTSC

		mov dword ptr[m3],EAX

		mov dword ptr[m3 + 4],EDX

	}

	/*************************************************************/

	u32* v2 = (u32*)malloc(400000000);

	u32 n = 0;

	while(n < 100000000)

	{

		v2[n] = n;

		n++;

	}

	/*************************************************************/

	//array第二次计时

	_asm

	{

		RDTSC

		mov dword ptr[m4],EAX

		mov dword ptr[m4 + 4],EDX

	}

	free(v2);

	/*************************************************************/

	//计算CPU频率

	_asm

	{

		RDTSC

		mov dword ptr[m5],EAX

		mov dword ptr[m5 + 4],EDX

	}

	Sleep(1000);

	_asm

	{

		RDTSC

		mov dword ptr[m6],EAX

		mov dword ptr[m6 + 4],EDX

	}

	u64 CPUFrequency = *((u64*)&m6) - *((u64*)&m5);

	/*************************************************************

	以下是api计时方法*/

	LARGE_INTEGER Frequency,FrequencyStart,FrequencyEnd,FrequencyStart1,FrequencyEnd1;//精确计数器频率

	QueryPerformanceFrequency(&Frequency);//获得计数器频率

	QueryPerformanceCounter(&FrequencyStart);

	/*************************************************************/

	//函数体

	std::vector<u32> v3(100000000);

	u32 j = 0;

	while(j < 100000000)

	{

		v3[j] = j;

		j++;

	}

	/*************************************************************/

	QueryPerformanceCounter(&FrequencyEnd);

	/*************************************************************/

	QueryPerformanceCounter(&FrequencyStart1);

	/*************************************************************/

	//函数体

	u32* v4 = (u32*)malloc(400000000);

	u32 k = 0;

	while(k < 100000000)

	{

		v4[k] = k;

		k++;

	}

	/*************************************************************/

	QueryPerformanceCounter(&FrequencyEnd1);

	free(v4);

	/*************************************************************/

	std::cout << "\n本次测试分别对vector和array进行100000000个数据填入,并且使用汇编和api两种方法进行比对,分别得出两者所用的时间,单位为秒:\n" 

			  << "汇编测得'Vector'所用时间为:\t" << (double)(*((u64*)&m2) - *((u64*)&m1) / CPUFrequency) << std::endl

		      << "汇编测得'Array'所用时间为:\t" << (double)(*((u64*)&m4) - *((u64*)&m3) / CPUFrequency) << std::endl

			  << "api测得'Vector'所用时间为:\t" << ((double)(FrequencyEnd.QuadPart - FrequencyStart.QuadPart) / (double)Frequency.QuadPart) << std::endl

			  << "api测得'array'所用时间为:\t" << ((double)(FrequencyEnd1.QuadPart - FrequencyStart1.QuadPart) / (double)Frequency.QuadPart) << std::endl;

	std::cout << "汇编测得CPU主频为:" << (double)CPUFrequency /1024 /1024 /1024 << "\tGHZ" << std::endl;

	/*************************************************************************************************************************/

	system("pause");

}

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功