【发布时间】:2013-07-04 10:40:36
【问题描述】:
这是其他编译器的常见问题(C#、VC++、GCC。)我想知道 Delphi 编译器的相同问题(任何版本;我目前使用的是 2010 和 XE2 和很快就会使用 XE4。)
我在编写高性能代码时遇到了一种情况,必须检查一个条件,但在大多数情况下不需要采取任何措施:
if UnlikelyCondition then
HandleUnlikelyCondition
else
HandleLikelyCondition
end;
对于可能的情况,通常不需要做任何事情:
if UnlikelyCondition then
HandleUnlikelyCondition
else
Exit
end;
我想向编译器提示if 语句的第二个分支是要优化的分支。我如何在 Delphi 中做到这一点?
当前代码
目前,我编写代码时假设 if statement's condition equalling true 是最佳优化对象:
if LikelyCondition then
HandleLikelyCondition
else
HandleUnlikelyCondition
end;
或
if LikelyCondition then Exit;
HandleUnlikelyCondition;
在刚才使用这两个示例中的第一个的测试中,我得到了 50% 的额外性能提升,像这样重组我的 if 语句,即假设 if 语句的条件是 true。或许换种方式来表达这个问题是,这是我能做的最好的吗?
如果你之前没有遇到过分支误判,this epic answer is an illuminating read.
【问题讨论】:
-
请注意,这与分支(错误)预测无关......
-
@OliCharlesworth 你能解释一下吗?
-
据我所知,GCC 的
__builtin_expect(和类似的)不直接控制分支预测器(我不确定这在现代 x86 上是否可行),它们只是改变生成的支持“可能”路径的代码,这样它需要更少的指令。 -
我不相信 Delphi 编译器存在这样的东西。
-
Borland 编译器如今在优化方面很糟糕 :( 您必须在
then之后编写可能的分支代码,而在else之后编写不太可能的分支代码(在大多数情况下,无论如何都是好的代码风格)
标签: delphi optimization micro-optimization