php7.0的起飞
 
一 zval使用栈内存(从24位缩减至16位)
在Zend引擎和扩展中,经常要创建一个PHP的变量,底层就是一个zval指针。之前的版本都是通过MAKE_STD_ZVAL动态的从堆上分配一个zval内存。而PHP7可以直接使用栈内存。PHP代码中创建的变量也进行了优化,PHP7直接在栈内存上预分配zval。这样节约了大量内存分配和内存管理的操作。
zval可以表示一切PHP中的数据类型, 所以它包含了一个type字段, 表示这个zval存储的是什么类型的值, 常见的可能选项是IS_NULL, IS_LONG, IS_STRING, IS_ARRAY, IS_OBJECT等等.
 
二 hashtable桶内直接存数据(从72位减少至56位)
 
PHP5的hashtable每个元素都是一个 Bucket ,而PHP7直接存Bucket,减少了内存申请次数,提升了Cache命中率和内存访问速度。
Bucket 原意为桶,在这里引申为存放文件的容器。每个用户可以创建多个Bucket,来存放不同的容器。每个用户也都可以创建、配置Bucket,来存放自己的文件。
  我们需要注意的是,每个 Object 都要放在一个特定的 Bucket 内,不存在一个脱离 Bucket 的 Object。
 
三 zend_string存储hash值,array查询不再需要重复计算hash
 
PHP7为字符串单独创建了新类型叫做zend_string,除了char 指针和长度之外,增加了一个hash字段,用于保存字符串的hash值。PHP中array是核心数据结构,PHP程序中往往都有大量的$array[$key]操作,虽然hashtable查找的时间复杂度是O(1),但$key要转为hash值是要经过计算的。不仅仅是array操作,实际上PHP底层对于类属性、类方法、函数,访问时都要先通过hashtable查找到对应的指针,再执行对应的操作。PHP7之前Zend引擎会有大量的CPU时间用于计算hash值。
实际上PHP程序运行起来之后,大部分情况下$key的值都是不变的。PHP7干脆将这个hash值保存起来,下次直接使用,这样就节省了大量的hash计算操作.
 
四 zend_parse_parameters改为宏实现
 
PHP的C扩展函数与PHP中的变量进行参数输入时,要使用zend_parse_parameters()函数,这个函数根据一个字符串参数找到对应PHP的zval指针,然后进行赋值。 这个函数实际上有一定的性能消耗。PHP7直接使用宏替换了zend_parse_parameters函数,C扩展中不再需要使用zend_parse_parameters进行逐个参数的查找,宏展开后自动会实现参数赋值。仅此一项就提升了5%的性能。
 
五 新增加4种OPCODE
 
很多PHP程序中会大量使用call_user_function, is_int/string/array, strlen , defined 函数。PHP5 都是以扩展函数的方式提供,PHP7中这4类函数改成ZendVM的OPCODE指令,执行更快。
 
 
 
鸣谢:简书 maquewy  。  csdn  black_ox