__builtin_expect
这几天研究zend源码看到了
#if PHP_HAVE_BUILTIN_EXPECT
# define EXPECTED(condition) __builtin_expect(!!(condition), 1)
# define UNEXPECTED(condition) __builtin_expect(!!(condition), 0)
#else
# define EXPECTED(condition) (condition)
# define UNEXPECTED(condition) (condition)
#endif
看到zend在if位置用了非常多的这个,就比较懵圈不知道他是干什么的,于是展开了学习
学习地址:
https://www.jianshu.com/p/2684613a300f
__builtin_expect((x),1)表示 x 的值为真的可能性更大;
__builtin_expect((x),0)表示 x 的值为假的可能性更大。
__builtin_expect() 是 GCC (version >= 2.96)提供给程序员使用的,目的是将“分支转移”的信息提供给编译器,这样编译器可以对代码进行优化,以减少指令跳转带来的性能下降。
划重点了::
也就是说,使用EXPECTED,执行 if 后面的语句的机会更大,使用 unlikely(),执行 else 后面的语句的机会更大。通过这种方式,编译器在编译过程中,会将可能性更大的代码紧跟着起面的代码,从而减少指令跳转带来的性能上的下降。
demo:
//
// Created by zhanglei on 19-8-7.
//
#include <stdio.h>
# define UNEXPECTED(condition) __builtin_expect((condition), 0)
int main()
{
if(UNEXPECTED(0))
{
printf("111\n");
}else{
printf("222\n");
}
}