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;
}