CPU/编译器分支预测
在时间关键型流程中,我尽量避免引入分支,但有时并没有切实可行的方法 在这些情况下,针对特定条件的不同测试方法之间是否存在性能差异?是建议测试最可能的结果,还是没有区别?也就是说,在CPU或编译器架构中,真与假条件之间是否有不同的“权重” 例如,以下三个片段之间通常会有差异:CPU/编译器分支预测,c,compiler-optimization,cpu-architecture,C,Compiler Optimization,Cpu Architecture,在时间关键型流程中,我尽量避免引入分支,但有时并没有切实可行的方法 在这些情况下,针对特定条件的不同测试方法之间是否存在性能差异?是建议测试最可能的结果,还是没有区别?也就是说,在CPU或编译器架构中,真与假条件之间是否有不同的“权重” 例如,以下三个片段之间通常会有差异: // snippet 1: test for exception first if ( !likely_to_happen ) { foo(); } else { bar(); } // snippet 2: te
// snippet 1: test for exception first
if ( !likely_to_happen ) {
foo();
} else {
bar();
}
// snippet 2: test for most common cases first
if ( likely_to_happen ) {
bar();
} else {
foo();
}
// snippet 3: test for exception in an alternative way
if ( not_likely_to_happen) {
foo();
} else {
bar();
}
如果可能,您应该明确地告诉编译器。再见,谢谢。我发现“\uuuu builtin\u expect”似乎是普遍推荐的解决方案。不知何故,这感觉有些笨拙,或者至少不雅观。我希望有一种通用的代码模式(如对代码流排序或对真实条件进行优先级排序等),它不涉及特定于编译器的宏。您总是可以使用不同的方式对代码进行排序,以帮助进行分支预测。然而,它们在很大程度上是特定于代码的,很难推广,例如dox总是减少分支。也就是说,你总是可以考虑分拣数据是否可以帮助,等等,你可以搜索类似C方法的东西来减少分支等,看看其他什么共性,没有一种标准的方式来把热代码和冷代码信息传递给编译器。编译器通常不会尝试使用C的布局来决定如何布局asm。相反,他们有猜测分支可能性的启发式方法。这些启发式方法通常不能做得很好,但您可以通过使用概要文件引导的优化来解决所有这些问题。e、 g.
gcc-fprofile generate-O3
,在一些常用输入上运行程序,使用gcc-fprofile use-O3
重新编译。如果可能,您应该明确告诉编译器。再见,谢谢。我发现“\uuuu builtin\u expect”似乎是普遍推荐的解决方案。不知何故,这感觉有些笨拙,或者至少不雅观。我希望有一种通用的代码模式(如对代码流排序或对真实条件进行优先级排序等),它不涉及特定于编译器的宏。您总是可以使用不同的方式对代码进行排序,以帮助进行分支预测。然而,它们在很大程度上是特定于代码的,很难推广,例如dox总是减少分支。也就是说,你总是可以考虑分拣数据是否可以帮助,等等,你可以搜索类似C方法的东西来减少分支等,看看其他什么共性,没有一种标准的方式来把热代码和冷代码信息传递给编译器。编译器通常不会尝试使用C的布局来决定如何布局asm。相反,他们有猜测分支可能性的启发式方法。这些启发式方法通常不能做得很好,但您可以通过使用概要文件引导的优化来解决所有这些问题。e、 g.gcc-fprofile generate-O3
,在一些常用输入上运行程序,使用gcc-fprofile use-O3
重新编译。