【问题标题】:Is it possible to hint a specific if-statement branch is most likely to be executed in the Delphi compiler?是否可以暗示一个特定的 if 语句分支最有可能在 Delphi 编译器中执行?
【发布时间】: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


【解决方案1】:

语言或编译器中没有任何内容允许您为分支预测提供提示。在任何情况下,即使编译器发出包含提示的目标代码,现代架构也会忽略这些提示。

【讨论】:

  • 谢谢大卫。您确定现代建筑会忽略这些提示吗? SO上的其他问题似乎相当肯定暗示有好处 - 至少暗示编译器,以便它可以优化代码,使内部预测更准确。而且,你会说我当前使用的代码是优化这个的最佳方法吗?
  • 其他问题没有这么说。他们说 P4 暗示了跳转操作码,但 P4 忽略了它们。而现代分支预测器甚至更强大,没有任何提示。
  • 我指的是(这个问题)[stackoverflow.com/questions/3702903/… 其中“真实”分支是假设运行的分支。也许编译器可以重新组织代码。不过,感谢您的回答(也感谢@NickHodges) - 很高兴得到确认!
  • @David:请注意编译时分支提示don't actually turn into runtime hints to the CPU branch predictor,它们只会影响函数布局和无分支 (cmov) 与分支的选择。 How do the likely/unlikely macros in the Linux kernel work and what is their benefit? 显示示例代码生成。未采用的分支中断管道的次数少于采用的分支,即使两者都被正确预测。
猜你喜欢
  • 2011-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-21
  • 2019-10-13
  • 2013-02-26
  • 2021-03-10
相关资源
最近更新 更多