PHP源码之UNEXPECTED和EXPECTED

在看PHP源码的过程中, 总是无数次看到这两个宏, 一直不太清楚这两个宏的作用. 今天闲来无事, 认真研究了一下, 这两个宏定义在zend_portability.h.

代码片断:

#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

如果定义了PHP_HAVE_BUILTIN_EXPECT这个宏, 就会采用gcc的内建函数__builtin_expect来进行分支预测, 因为现在的CPU都是流水线式的,可以一次性预读好几条指令, 通过分支预测来预先读取下一条指令, 增加代码的执行效率.

if (EXPECTED(x > 0)) {
    // do something
} else {
    // do something2
}

如果x > 0是大概率的, 那么应该使用EXPECTED, 这样处理器会预读//do something的代码指令, 如果x > 0是小概率的, 那么应该使用UNEXPECTED, 这样处理器会预读//do something2的代码指令.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值