代码分支预测优化
我们的代码中,if/else
代码编译后,一个分支的汇编代码紧随前面的代码,而另一个分支的汇编代码需要使用 JMP 指令跳转才能访问到。很明显,通过 JMP 访问需要更多的时间。
在复杂程序中,有很多的 if/else
语句,又或者是有频繁调用且有 if/else
语句的函数,每秒被调用几万次。通常程序员在分支预测方面做的很糟糕,编译器又不能精准的预测每一个分支,这是 JMP 指令产生的时间浪费就会很大。
一、likely 和 unlikely
Linux 内核代码中,在条件判断语句中有很多 likely()
和 unlikely()
的调用。
1 | #define likely(x) __builtin_expect(!!(x), 1) |