PHP7新特性
php7.x增加的新特性介绍可以参考这里:
php7.x版本系列相比之前的php的版本提交性能提高了不少,下图是wordpress在不同php版本下的压力测试表现。
这里面其中的一些主要改变是性能提高的关键,主要有以下内容。
1.zval使用栈内存
在zend引擎和扩展中,经常要创建php变量,其底层就是一个zval指针,之前的php版本都是通过MAKE_STD_ZVAL动态的从堆内存上分配一个zval内存。而php7直接使用栈内存,好处是少了一次内存分配。php程序中回大量创建变量,所以php7会在栈上预分配一块内存来存放这些zval,来节省大量的内存分配和管理操作。
php5
zval *val ; MAKE_STD_ZVAL(val)
php7
zval val;
2.zend_string存储hash值,array查询不再需要重复计算hash
数组是php比较重要的数据结构,php程序中会有大量的array关联查询,虽然hashtable查找的复杂度是O(1),但是key的值每次要转化成一个hash值,需要用一个复杂的hash函数去计算的,这样就会占用cpu时间,不过不光数组,在php底层很多地方都会用到hashtable,比如类的属性方法函数等。其实php程序运行起来大部分key的值是不变的,所以php7就保存了这些hash值下次直接使用,那么php7就为字符串单独创建了新类型叫做zend_string,除了char*指针和长度之外,增加了一个hash字段,用于保存字符串的hash值,数据键值查找不再反复需要计算hash值。为了优化数组的键值查找。