ZEND 中的 EXPECTED 和 UNEXPECTED

__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");
    }

}
发布了93 篇原创文章 · 获赞 2 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_32783703/article/details/103278242