【发布时间】:2011-04-11 19:13:33
【问题描述】:
是否有任何可移植的方式来进行分支预测提示?考虑以下示例:
if (unlikely_condition) {
/* ..A.. */
} else {
/* ..B.. */
}
这与做有什么不同:
if (!unlikely_condition) {
/* ..B.. */
} else {
/* ..A.. */
}
或者是使用编译器特定提示的唯一方法? (例如 GCC 上的 __builtin_expect)
编译器会根据条件的顺序对if 条件进行不同的处理吗?
【问题讨论】:
-
我想知道这是否可能是 C++0x 属性在
if的条件下坚持的东西?喜欢if([[unlikely]] unlikely_condition) { ... }?目前语法不允许。但它确实允许if([[unlikely]] bool b = ...) { }。也许有人会滥用它:) -
GNU 代码在完全非性能关键代码中包含大量可笑的
if(likely(...))垃圾,IMO 这真的很糟糕。一方面,它在英语中读起来不自然——听起来像是“如果这个条件很可能是真的”而不是“如果这个条件是真的,它很可能是”。另一方面,它只是杂乱无章。除非您有很多性能关键条件无法编译为cmov或类似条件,否则请忽略分支预测提示。 -
@R.. 我想我明白为什么 Linux 内核中到处都是
if(unlikely(...))。他们更喜欢让代码流更容易遵循的早期退出。如果他们不这样做,那么静态分支预测总是会失败。 -
这会使 Linux 慢 0.00001%。不可测量。如果是这样,只需将这些废话放在几个可测量的条件句中,而不是无处不在。
-
也是一种文档提示。我经常用它来区分活动工作代码和异常错误处理代码。这在我工作的架构上说,这是一个非常有用的机制,因为 ISA 在分支指令 (SPARC) 中有提示位。
标签: c++ c optimization c++20 branch-prediction