关闭

关于php内核中 __builtin_expect 的解释

标签: php内核__builtin_expect编译器compiler
420人阅读 评论(0) 收藏 举报
分类:

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



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:83626次
    • 积分:1884
    • 等级:
    • 排名:千里之外
    • 原创:101篇
    • 转载:39篇
    • 译文:0篇
    • 评论:4条
    文章分类
    最新评论