内核中可能调用和不太可能调用之间的区别是什么。在搜索内核源代码时,我发现了这些语句。
# define likely(x) __builtin_expect(!!(x), 1)
# define unlikely(x) __builtin_expect(!!(x), 0)
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下吗?
Mat*_*Mat 14
它们是 GCC 的编译器提示。它们在条件中用于告诉编译器是否可能采用分支。它可以帮助编译器以最适合最频繁结果的方式放置代码。
它们是这样使用的:
if (likely(some_condition)) {
// the compiler will try and make the code layout optimal for the case
// where some_condition is true, i.e. where this block is run
most_likely_action();
} else {
// this block is less frequently used
corner_case();
}
Run Code Online (Sandbox Code Playgroud)
应该非常小心地使用它(即基于实际的分支分析结果)。错误的提示会降低性能(显然)。
通过搜索 可以轻松找到有关如何优化代码的一些示例GCC __builtin_expect
。这篇博文gcc 优化: __builtin_expect例如详细介绍了使用它的反汇编。
可以完成的优化类型非常特定于处理器。一般的想法是,如果不到处分支/跳转,处理器通常会更快地运行代码。它越线性,分支越可预测,它运行得越快。(例如,对于具有深管道的处理器尤其如此。)
因此,例如,如果目标 CPU 喜欢,那么编译器将发出这样的代码,使得最可能的分支不会涉及跳转。