代码的优化 (三)(小疯子)

EnochShen 2004-12-19 01:22:21
/*
在C++中,关键字Inline可以被加入到任何函数的声明中。这个关键字请求编译器
用函数内部的代码替换所有对于指出的函数的调用。 这样做在两个方面快于函数
调用。这样做在两个方面快于函数调用:第一,省去了调用指令需要的执行时间;
第二,省去了传递变元和传递过程需要的时间。但是使用这种方法在优化程序速度
的同时,程序长度变大了,因此需要更多的ROM。另外它比宏更安全更容易调试。
不过值得注意的是Inline仅仅是对编译器的建议,编译器有权利忽略这个建议。
比如:函数体的大小,是否有局部对象被声明,函数的复杂性等等。如果当编译器
拒绝内联一个函数的时候,那个函数会像普通函数一样被对待,但是还会出现一些
其他的问题。使用这种优化在Inline函数频繁调用并且只包含几行代码的时候是最
安全最有效的。
*/

//寄存器变量

void CMainFrame::OnTest5()
{
nTestNumber = 0;

QueryPerformanceCounter(&n64StartCount);
QueryPerformanceFrequency(&n64Frequency);

for(dwIndex = 0;dwIndex < 10000000;dwIndex ++)
{
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(register UINT nIndex = 0;nIndex < 10000000;nIndex ++)
{
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);
}

/*
循环计数是应用寄存器变量的最好的候选者。当它们没有被存入一个寄存器中,
大部分的循环时间都被用在了从内存中取出变量和给变量赋新值上。如果把它存入
一个寄存器中的话,将会大大减少这种负担。需要注意的是,register仅仅是对编
译器的一个建议。就好比内联函数一样,编译器可以拒绝把一个对象存储到寄存器
中。另外,现代的编译器都会通过把变量放入寄存器中来优化循环计数。register
并不仅仅局限在基本类型上,它能够被应用于任何类型的对象。如果对象太大而不
能装进寄存器的话,编译器仍然能够把它放入一个高速存储器中,例如cache。
另外:用register声明函数型参将会是建议编译器把实参存入寄存器中而不是堆栈中。
*/
...全文
53 点赞 收藏 1
写回复
1 条回复
EnochShen 2004年12月19日
呵呵,自己先顶一下。
回复 点赞
发动态
发帖子
硬件/系统
创建于2007-09-28

2260

社区成员

1.7w+

社区内容

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