Zend/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
main/php-config.h
/* Whether the compiler supports __builtin_expect */
#define PHP_HAVE_BUILTIN_EXPECT 1
解释:
# define EXPECTED(condition) __builtin_expect(!!(condition), 1)
# define UNEXPECTED(condition) __builtin_expect(!!(condition), 0)
1 !!(condition)真假变量 非非得真的逻辑运算,以0或1来达到预判
2 if(EXPECTED(condition)) 等价于 if(condition)
if(UNEXPECTED(condition)) 也等价于 if(condition)
3 __builtin_expect((condition),1) 表示 condition 的值为真的可能性更大。
__builtin_expect((condition),0) 表示 condition 的值为假的可能性更大。
编译器在编译过程中,会将可能性更大的代码紧跟着前面的代码,从而减少指令跳转。
例子:
Zend/zend_API.h
static zend_always_inline int zend_parse_arg_str(zval *arg, zend_string **dest, int check_null)
{
if (EXPECTED(Z_TYPE_P(arg) == IS_STRING)) {
*dest = Z_STR_P(arg);
} else if (check_null && Z_TYPE_P(arg) == IS_NULL) {
*dest = NULL;
} else {
return zend_parse_arg_str_slow(arg, dest);
}
return 1;
}
static zend_always_inline int zend_parse_arg_string(zval *arg, char **dest, size_t *dest_len, int check_null)
{
zend_string *str;
if (!zend_parse_arg_str(arg, &str, check_null)) {
return 0;
}
if (check_null && UNEXPECTED(!str)) {
*dest = NULL;
*dest_len = 0;
} else {
*dest = str->val;
*dest_len = str->len;
}
return 1;
}