2012-09-13 44 views
0

我有兴趣从一开始就编写好的代码,而不是稍后优化代码。对不起,没有提供基准我目前没有工作场景。感谢您的关注!微优化 - 访问递归成员时的编译优化

FunctionY使用FunctionX的性能提升是多少?

关于这个问题已经有很多关于stackoverflow的讨论,但我在如下所示访问子成员(递归)的情况下存在疑问。编译器(比如VS2008)会将FunctionX优化成类似FunctionY的东西吗?

void FunctionX(Obj * pObj) 
{ 
    pObj->MemberQ->MemberW->MemberA.function1(); 
    pObj->MemberQ->MemberW->MemberA.function2(); 
    pObj->MemberQ->MemberW->MemberB.function1(); 
    pObj->MemberQ->MemberW->MemberB.function2(); 
    .. 
    pObj->MemberQ->MemberW->MemberZ.function1(); 
    pObj->MemberQ->MemberW->MemberZ.function2(); 
} 

void FunctionY(Obj * pObj) 
{ 
    W * localPtr = pObj->MemberQ->MemberW; 
    localPtr->MemberA.function1(); 
    localPtr->MemberA.function2(); 
    localPtr->MemberB.function1(); 
    localPtr->MemberB.function2(); 
    ... 
    localPtr->MemberZ.function1(); 
    localPtr->MemberZ.function2(); 
} 
+0

你是否已经对该代码进行了简介,看看它是否真的很慢? –

+0

“编写好的代码”和“优化”是两个完全不同的东西,并不是相互排斥的。 –

回答

2

如果没有部件指针的是挥发性的或指针易失性和你没有operator ->在链两者的功能是相同的过载对任何成员。 您所建议的优化规则被广泛称为“常见表达式消除”,几十年来得到绝大多数编译器的支持。

+0

谢谢,通用表达式消除是指导我更有用的信息的术语。 –

+0

这。这两个代码示例不可能有任何不同。 –

1

理论上,你可以节省额外的指针解引用,但是在现实世界中,编译器可能会为你优化它,所以这是一个无用的优化。

这就是为什么首先进行配置文件,然后进行优化很重要。编译器正在尽其所能帮助你,你也可以确保你不只是在做已经在做的事情。

+0

优化使良好的代码变得糟糕。 “好代码”很简单,干净而且正确。只有在剖析器(和其他信息)告诉你需要优化的东西时,情况才会变得更糟。 –

+0

@JonathanSeng好的代码也必须是可读的,在这种情况下声明一个显式变量会使代码更容易阅读和理解。 – UnknownGosu

+0

如果实际上通过类似的方式获得了相当的性能(虽然在分析之后),但是函数更大并且'functionX'调用的地方更加分散。中间变量的结果是成员更频繁地进入缓存。 –

0

如果编译器足够好,它应该将functionX转换成类似于functionY的东西。 但是,您可以在不同的编译器和具有不同优化标志的相同编译器上获得不同的结果。 使用“哑”编译器函数应该更快,恕我直言,它更可读和更快的代码。所以坚持使用功能Y

ps。你应该看看一些代码风格指南,通常成员和函数名应该始终以小​​写字母开头

+0

Thanks!我只使用大写字母来使它们与代码的其他部分不同,以更好地反映我的问题。 –