【原创】PHP内核中的UNEXPECTED(condition)宏是什么意思?

blogdaren 2020-12-28 2评论 472人次

问题背景:

阅读PHP内核代码期间,发现有大量的宏:EXPECTED(condition)、UNEXPECTED(condition),比如在HashTable的相关实现中就有如下代码片段:

    if (nSize < HT_MIN_SIZE) {
        nSize = HT_MIN_SIZE;
    } else if (UNEXPECTED(nSize >= HT_MAX_SIZE)) {
        zend_error_noreturn(E_ERROR, "Possible integer overflow in memory allocation (%zu * %zu + %zu)", nSize, sizeof(Bucket), sizeof(Bucket));
    }    
那么这两个宏到底是干啥的?有什么意义呢?

问题追踪:

通过代码跟踪,不难发现这两个宏调用的是如下两个LINUX指令:

# define EXPECTED(condition)   __builtin_expect(!!(condition), 1)
# define UNEXPECTED(condition) __builtin_expect(!!(condition), 0) 

问题说明:

__builtin_expect是Linux 内核中最常用的性能优化技术之一。在码农编写有条件代码时,通常知道哪个分支最有可能被执行,而哪个分支很少被执行,如果编译器知道这种预测信息,就可以围绕最可能执行的分支生成最优的代码。如果一个条件标上了“EXPECTED”,那么编译器可以把代码的 True 部分直接放在分支指令后面(这样就不需要执行分支指令)。

宏的含义:

(1)EXPECTED(condition)      代表大概率 condition 成立;

(2)UNEXPECTED(condition)  代表大概率 condition 不成立;

问题补充:

关于涉及到的性能优化细节需要从汇编层面加以理解,待补充~

版权声明:除非注明,本文由( blogdaren )原创,转载请保留文章出处。

本文链接:【原创】PHP内核中的UNEXPECTED(condition)宏是什么意思?

用户评论:

2020-12-29 14:29
这是专心搞PHP源码阅读理解呢呀
blogdaren
2021-01-01 18:27
@肥臣:不容易啊XAR^-^、不慎陷入了魔性的指针圈难以自拔、阅读PHP源码让我受益十分巨大:目前PHP的很多实现已经释然,很欣慰; 除外更让我彻底意识到坊间一句话:没有真正弄懂C指针那C等于是白学,一点不假也一点儿不夸张。 PHP内核代码随处充满了浓烈的指针气息、各种高大上的数据结构算法无不依赖于指针实现;眼下为了验证我对哈希表(咱PHP那牛逼而灵活的数组就是靠这玩意儿实现)的深刻理解,准备根据我自己目前的学习和理解撸一仿真版HashTable.

发表评论:

您的昵称:
电子邮件:
个人主页:

Free Web Hosting