likely和unlikely是Linux内核中用于给编译器提示分支预测的宏。这些宏可以帮助编译器更好地优化代码,以提高程序的性能。它们通常与条件语句的分支一起使用,以指示哪些分支更有可能执行,哪些分支更不可能执行。
在Linux内核中,likely和unlikely宏通常定义如下:
#define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0)
这些宏实际上使用了GCC编译器的__builtin_expect内置函数,该函数用于提示编译器条件表达式的可能性。参数x通常是一个条件表达式,可以是真或假。
例如,在Linux内核中,通常会将likely用于可能出现的快速路径,而将unlikely用于可能出现的慢速路径,以帮助编译器更好地优化代码。
请注意,使用likely和unlikely宏需要谨慎,不应该滥用。在实际使用中,应该基于性能分析和测试结果来确定哪些分支更有可能和不太可能执行,并相应地使用这些宏。如果错误地使用这些宏,可能会导致性能下降,因此建议在优化代码之前进行充分的性能分析。
"likely" 和 "unlikely" 是 Linux 内核中用于优化条件分支的宏。它们通常用于帮助编译器更好地优化代码,以提高程序的性能。这两个宏的主要目的是告诉编译器哪些条件分支更可能发生,以便它可以更好地进行分支预测和代码优化。
likely
宏:likely
宏用于标记一个条件分支,表示该条件分支非常可能为真。这有助于编译器在生成机器代码时优化,使得执行概率较高的分支更快。通常情况下,你会在期望条件为真的情况下使用 likely
宏。- if (likely(condition)) {
- // Code that is likely to be executed
- } else {
- // Code that is less likely to be executed
- }
unlikely
宏:unlikely
宏用于标记一个条件分支,表示该条件分支非常可能为假。这有助于编译器在生成机器代码时优化,使得执行概率较低的分支更快。通常情况下,你会在期望条件为假的情况下使用 unlikely
宏。- if (unlikely(condition)) {
- // Code that is unlikely to be executed
- } else {
- // Code that is more likely to be executed
- }
这些宏通常在内核编程中使用,因为内核需要极高的性能。在一般的应用程序中,使用这些宏的性能影响可能不明显,因此在普通应用程序中使用它们可能没有太大的必要。
在你想要对某个条件选择语句进行优化之前,一定要搞清楚其中是不是存在这么一个条件,在绝大多数情况下都会成立。这点十分重要:如果你的判断正确,确实是这个条件占压倒性的地位,那么性能会得到提升;如果你搞错了,性能反而会下降。正如上面这些例子所示,通常在对一些错误条件进行判断的时候会用到unlikely)和likely(。你可以猜到,unlikely)在内核中会得到更广泛的使用,因为if语句往往判断一种特殊情况。
如果对你有帮助,请点赞收藏,谢谢~这是我更新的动力~
如果有任何问题欢迎在评论区交流~我们一同成长~