原文
它们是什么 ?
在linux内核代码,在条件判断时经常看到likely()
和 unlikely()
,例如:
在这里,调用likely()或unlikely()告诉编译器这个条件很有可能或者不太有可能发生,好让编译器对这个条件判断进行正确地优化。这两个宏在include/linux/compiler.h文件中可以找到:
在GCC文档中可找到上述代码中__builtin_expect的说明,摘录如下:
做了什么
编译器优化时,根据条件跳转的预期值,按正确地顺序生成汇编代码,把“很有可能发生”的条件分支放在顺序执行指令段,而不是jmp指令段(jmp指令会打乱CPU的指令执行顺序,大大影响CPU指令执行效率)。
举例说明。下面这个简单的C程序使用gcc -O2
进行编译。
使用objdump -S
反汇编,查看它的汇编代码。
在上面程序中,用likely()代替其中的unlikely(),重新编译,再来看它的汇编代码:
如何使用
在一个条件判断语句中,当这个条件被认为是非常非常有可能满足时,则使用likely()
宏,否则,条件非常非常不可能或很难满足时,则使用unlikely()
宏。
本文链接, 未经许可,禁止转载