PHP源码之UNEXPECTED和EXPECTED

来源:互联网 发布:淘宝wap流量是什么 编辑:程序博客网 时间:2024/06/06 04:00

在看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的代码指令.

原创粉丝点击