EnochShen 2004年12月18日
代码的优化 (二)(小疯子)
//直接调用和宏调用的比较

#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^
*/
...全文
94 点赞 收藏 9
写回复
9 条回复

还没有回复,快来抢沙发~

发动态
发帖子
硬件/系统
创建于2007-09-28

2259

社区成员

1.7w+

社区内容

VC/MFC 硬件/系统
社区公告
暂无公告