关于php内核中 __builtin_expect 的解释

原创 2015年11月19日 11:57:35

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



版权声明:本文为博主原创文章,未经博主允许不得转载。

GCC __builtin_expect的作用

将流水线引入cpu,可以提高cpu的效率。更简单的说,让cpu可以预先取出下一条指令,可以提供cpu的效率。如下图所示: +-------------------------------- |取指...

【整理】__builtin_expect 解惑

转载自:https://my.oschina.net/moooofly/blog/175019 最近看 GLib 的代码遇到这个东东,网上搜索一圈,发现很多人都写过这个,自己今天才研究到,汗颜一下,...

like,unlikely宏和GCC内建函数__builtin_expect()

在阅读GStreamer代码中有两个调用很频繁的宏: #define G_LIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR(expr), 1)) #...
  • xfding
  • xfding
  • 2011年02月21日 16:53
  • 1662

性能优化:__builtin_expect详解

转自:http://hi.baidu.com/lammy/blog/item/bc5e3d4e869073c3d1c86a89.html 在GTK+2.0源码中有很多这样的宏:G_LIKELY和...

gcc的内建函数__builtin_expect

1.问题引出 在内核代码的条件分支中的判断中,经常可以看到如下两条语句: [cpp] view plaincopy /* ...... */  if(unlikely(!so...

__builtin_expect详解

转自:http://hi.baidu.com/lammy/blog/item/bc5e3d4e869073c3d1c86a89.html 在GTK+2.0源码中有很多这样的宏:G_LIKELY和...

iOS性能优化系列之__builtin_expect分支预测优化

前言最近想整理下AFNetworking中https认证部分的代码逻辑,结果看到个神奇的东西__builtin_expect,竟然不知道这是干嘛的,搜索了一整子,记录一下,可以作为一个优化点/* *...

libcurl的使用以及Expect100-continue 问题解决php,c,C++

CURL使用 Curl恐怕是大多数项目喜欢依赖的一个轻巧、高效的http协议处理库。 下面是简单的例子: size_t write_data(void *buffer, size_t s...

PHP内核探索:解释器的执行过程

这里将介绍引擎内部执行一个PHP脚本的流程,以CLI SAPI为例子来对流程中核心的部分做简单介绍,省去一些初始化及清理操作。 CLI(Command Line Interface)即PHP的命令行...
  • zndy10
  • zndy10
  • 2017年07月13日 09:35
  • 117

17.PHP内核探索:解释器的执行过程

这里将介绍引擎内部执行一个PHP脚本的流程,以CLI SAPI为例子来对流程中核心的部分做简单介绍,省去一些初始化及清理操作。 CLI(Command Line Interface)即PHP的命...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于php内核中 __builtin_expect 的解释
举报原因:
原因补充:

(最多只允许输入30个字)