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