关于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下的程序移植到MSVC下 之三 - __builtin_expect的实现

    内建函数 __builtin_expect 用于为编译器提供分支预测信息,其返回值是整数表达式 EXP 的值,C 的值必须是编译时常数。例如:++++ include/linux/compil...
  • celestialwy
  • celestialwy
  • 2006年10月27日 08:56
  • 4340

数组在PHP内核中的实现

PHP中经常使用数组,PHP的数组强大,而且速度也快,读写都可以在O(1)内完成,因为它每个元素的大小都是一致的,只要知道下标,便可以瞬间计算出其对应的元素在内存中的位置,从而直接取出或者写入。那么内...
  • u011986449
  • u011986449
  • 2014年05月17日 22:39
  • 1300

php内核函数natsort浅析

     今天发现了php有个自然排序的函数----natsort,第一次听说了原来还有一种叫做“自然排序”的算法,很好奇,官方手册(http://us.php.net/manual/en/funct...
  • yycai
  • yycai
  • 2009年08月01日 12:57
  • 1305

关于__builtin_expect

在查看libev源码ev.c 宏定义expect_false()时遇到__builtin_expect ((expr),(value))的函数调用。 搜索发现 __builtin_expect() ...
  • surpercore
  • surpercore
  • 2013年06月03日 17:26
  • 309

__builtin_expect详解

在GTK+2.0源码中有很多这样的宏:G_LIKELY和G_UNLIKELY。比如下面这段代码: if (G_LIKELY (acat == 1))     /* allocate throug...
  • chj90220
  • chj90220
  • 2013年09月08日 10:49
  • 818

likely() && unlikely() && __builtin_expect((x), 1)

在Linux2.6内核中,看到一对奇怪的函数,likely(), unlikely()。 追踪回去,发现其实是一对宏,如下实现: #define likely(x)  __builtin_expe...
  • joker0910
  • joker0910
  • 2011年08月08日 20:10
  • 4410

内核API

在驱动编程中经常使用copy_from_user / copy_to_
  • gongyuan073
  • gongyuan073
  • 2014年07月15日 12:26
  • 707

PHP内核--Zend引擎

在前面的章节介绍了PHP的生命周期,PHP的SAPI,SAPI处于PHP整个架构较上层,而真正脚本的执行主要由Zend引擎来完成, 这一小节我们介绍PHP脚本的执行。 目前编程语言可以分为两大类: ...
  • ty_hf
  • ty_hf
  • 2016年10月21日 00:04
  • 2307

PHP内核分析(一)

从宏观上来看,PHP内核的实现与世界上绝大多数的程序一样,接收输入数据, 做相应处理然后输出(返回)结果。 我们编写的代码就是PHP接收的输入数据,PHP内核对我们编写的代码进行解释和运算, 最后返回...
  • u010852544
  • u010852544
  • 2015年03月11日 14:07
  • 892

gcc 编译器 , __builtin_expect() 研究

在linux 代码中看到的 LIKELY(x), UNLIKELY(x), 其实是__builtin_expect() 测试__builtin_expect() 函数,到底是何意思?  c...
  • hejinjing_tom_com
  • hejinjing_tom_com
  • 2015年12月09日 13:17
  • 604
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于php内核中 __builtin_expect 的解释
举报原因:
原因补充:

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