代码的优化 (二)(小疯子)
//直接调用和宏调用的比较
#define testFunc2(A) (A++)
void CMainFrame::OnTest3()
{
nTestNumber = 0;
QueryPerformanceCounter(&n64StartCount);
QueryPerformanceFrequency(&n64Frequency);
for(dwIndex = 0;dwIndex < 10000000;dwIndex ++)
{
nTestNumber++;
}
QueryPerformanceCounter(&n64StopCount);
dwTotalTime = n64StopCount.LowPart - n64StartCount.LowPart;
if(dwTotalTime < 0)
{
dwTotalTime += 2^32;
}
float IntervalTime1 = (float)(n64StopCount.LowPart - n64StartCount.LowPart)
/(n64Frequency.LowPart + n64Frequency.HighPart * 2^32);
nTestNumber = 0;
QueryPerformanceCounter(&n64StartCount);
QueryPerformanceFrequency(&n64Frequency);
for(dwIndex = 0;dwIndex < 10000000;dwIndex ++)
{
testFunc2(nTestNumber);
}
QueryPerformanceCounter(&n64StopCount);
dwTotalTime = n64StopCount.LowPart - n64StartCount.LowPart;
if(dwTotalTime < 0)
{
dwTotalTime += 2^32;
}
float IntervalTime2 = (float)(n64StopCount.LowPart - n64StartCount.LowPart)
/(n64Frequency.LowPart + n64Frequency.HighPart * 2^32);
strOutput.Format("例子1所消耗的时间是:%f,例子2所消耗的时间是:%f。\r\n代码运行速度提高%.2f%%",
IntervalTime1,IntervalTime2,(IntervalTime1/IntervalTime2-1)*100);
AfxMessageBox(strOutput);
//经测试:宏调用速度 < 直接调用速度
}
//宏调用和Inline调用的比较
inline void testFunc3(int &nTestNumber)
{nTestNumber++;}
void CMainFrame::OnTest4()
{
nTestNumber = 0;
QueryPerformanceCounter(&n64StartCount);
QueryPerformanceFrequency(&n64Frequency);
for(dwIndex = 0;dwIndex < 10000000;dwIndex ++)
{
testFunc2(nTestNumber);
}
QueryPerformanceCounter(&n64StopCount);
dwTotalTime = n64StopCount.LowPart - n64StartCount.LowPart;
if(dwTotalTime < 0)
{
testFunc2(nTestNumber);
}
float IntervalTime1 = (float)(n64StopCount.LowPart - n64StartCount.LowPart)
/(n64Frequency.LowPart + n64Frequency.HighPart * 2^32);
nTestNumber = 0;
QueryPerformanceCounter(&n64StartCount);
QueryPerformanceFrequency(&n64Frequency);
for(dwIndex = 0;dwIndex < 10000000;dwIndex ++)
{
testFunc3(nTestNumber);
}
QueryPerformanceCounter(&n64StopCount);
dwTotalTime = n64StopCount.LowPart - n64StartCount.LowPart;
if(dwTotalTime < 0)
{
dwTotalTime += 2^32;
}
float IntervalTime2 = (float)(n64StopCount.LowPart - n64StartCount.LowPart)
/(n64Frequency.LowPart + n64Frequency.HighPart * 2^32);
strOutput.Format("例子1所消耗的时间是:%f,例子2所消耗的时间是:%f。\r\n代码运行速度提高%.2f%%",
IntervalTime1,IntervalTime2,(IntervalTime1/IntervalTime2 - 1)*100);
AfxMessageBox(strOutput);
//经测试:Inline调用速度 < 宏调用速度
}
/*
经测试后,Inline调用速度 < 宏调用速度 < 直接调用速度 <<(远远小于 几W倍) 段间跳转调用
这样我们在一个很大的循环里面,最好不要调用MFC的函数,甚至SDK的函数,除非万不得已.
比如 abs(number);我们可以写成{number>=0 ? number : -number};,
虽然意思是一样的,但是abs是段间跳转调用速度非常慢,或者把这段代码写成Inline,或者宏.
这样就在不使用内嵌汇编的基础上,最大程度上改进了代码的运行速度.^O^
*/