最近想测试一下自己写的函数效率如何,所以就研究了一下计时器的实现方法,发现,要实现精密计时,主要有两种方法,一种是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");
}
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课