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



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

相关文章推荐

__builtin_expect详解

今天在ndpi的源代码里面,看到了

__builtin_expect详解

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

GCC __builtin_expect的作用

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

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

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

GCC __builtin_expect的作用

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

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和...

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的命令行...

expect脚本解释

使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄、收藏。可是为什么要这么写却不知其然。本文用一个最短的例子说明脚本的原理。 脚本代码如下: ####...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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