php7.x增加的新特性介绍可以参考这里:
https://www.runoob.com/php/php7-new-features.html
https://php.net/manual/zh/migration70.new-features.php
这里面其中的一些主要改变是性能提高的关键,主要有以下内容。
1.zval使用栈内存
在zend引擎和扩展中,经常要创建php变量,而php7直接使用栈内存,php7会在栈上预分配一块内存来存放这些zval,好处是少了一次内存分配。
2.zend_string存储hash值,array查询不再需要重复计算hash
其实php程序运行起来大部分key的值是不变的,所以php7就保存了这些hash值下次直接使用,那么php7就增加了一个hash字段,用于保存字符串的hash值,数据键值查找不再反复需要计算hash值
3.hashtable桶内直接存放数据,减少了内存申请次数,顺便也提升了cache命中率和访问速度。
php7将之前arBuckets改成了上图中的arData,而这个arData直接就是一个大块内存,这个内存上面就是一个个桶bucket,这样的好处就是每次数据就不需要动态去申请内存。
4.zend_parse_parameters改为宏实现,性能提升15%。
5.新增加4种opcode,call_user_function(),is_int(),is_string(),is_array(),strlen(),defined() 4个函数变为php opcode指令,速度更快。
6.PHP7 的内核中有一个重要的变化是加入了 AST(Abstract syntax tree)抽象语法树,指代码在计算机内存的一种树状数据结构,树上的每个节点都表示源代码中的一种结构,便于计算机理解和解析。
在 PHP5系列版本中,从 php 脚本到 opcodes 的执行的过程如下:
词法扫描分析(Lexing):将源文件转换成 token 流;
语法分析(Parsing):生成 op arrays。
PHP7 中在语法分析阶段先生成 AST:
词法扫描分析(Lexing):将源文件转换成 token 流。
语法分析(Parsing):从 token 流生成抽象语法树。
Compilation:从抽象语法树生成 op arrays。
7.其他更多性能优化,如基础类型 float , int , bool等改成直接进行值拷贝。排序算法改进了,PCER with JIT , execute_data和opline使用全局寄存器,使用gdb4.8的PGO功能。