PHP7性能优化随笔

PHP7性能优化随笔

在zend引擎和扩展中,经常要创建php变量,其底层就是一个zval指针,之前的php版本都是通过MAKE_STD_ZVAL动态的从堆内存上分配一个zval内存。而php7直接使用栈内存,好处是少了一次内存分配。php程序中会大量创建变量,所以php7会在栈上预分配一块内存来存放这些zval,来节省大量的内存分配和管理操作。

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值。为了优化数组的键值查找。

3、hashtable桶内直接存放数据

hashtable桶内直接存放数据,减少了内存申请次数,顺便也提升了cache命中率和访问速度。因为指针不是连续的是分布在不同的内存页上,如果读取第一个或者第三个桶,它们的数据可能会在两个页上。

PHP7新特性: https://www.cnblogs.com/xingxia/p/php7.html

PHP7的新特性主要有:标量类型声明、返回值类型声明、null合并运算符、太空船操作符、通过define()定义常量数组、匿名类等。

https://www.cnblogs.com/cnsr/p/8625287.html

PHP7主要的改变是zval不再是独立的堆分配且其本身不再存储引用计数。转而是它们指向的复杂类型的值(如字符串、数组、对象)会存储引用计数。这通常会带来更少的内存分配、间接操作和内存使用。

参考: https://www.cnblogs.com/songgj/p/10398076.html