PHP7比PHP5在性能上有很大的提升
那么PHP7做了那些优化?
变量存储优化
1.存储变量的结构体变小,结构体成员尽量公用内存,内存占用降低,php7⼀个变量实际占⽤的内存⼤⼩为8字节,php5占用48字节,操作变快
2.php5是通过MAKE_STD_ZVAL动态的从堆内存上分配一个zval内存,php7直接使用栈内存,少了一次内存分配,php在大量创建变量时,php7会在栈上预分配一块内存来存放这些zval,栈内存可直接读取,堆内存不可以,节省了大量的内存分配和管理操作。
数组存储优化
hash计算:PHP底层对于字符串、数组、类属性、类方法、函数,访问时都要先通过hashtable查找到对应的指针,再执行对应的操作
1.PHP7为字符串单独创建了新类型叫做zend_string,除了char *指针和长度之外,增加了一个hash字段,用于保存字符串的hash值。
2.array查询有大量的$array[$key],大部分情况下$key的值都是不变的,PHP7将hash值保存起来,节省了大量的hash计算。
3.数组元素与hash映射表共享内存,降低了内存空间的占用。
hashtable存储优化
PHP5的链表是物理上的链表,链表中bucket之间的上下游关系通过真实存在的指针维护。
PHP7的链表是⼀种逻辑上的链表,所有bucket都分配在连续的数组内存中,不再通过指针维护上下游关系,每⼀个bucket只维护下⼀个bucket在数组中的索引(因为是连续内存,通过索引可以快速定位到bucket),即可完成链表上bucket的遍历。
哈希冲突:哈希冲突一般用链地址法或开放寻址法,PHP5和PHP7都使用链地址法解决哈希冲突,因为本来就是维护的哈希链表
函数调用
1.改进了函数的调用机制,通过对参数传递环节的优化,减少一些指令操作,提高了执行效
2.PHP程序中会大量使用call_user_function, is_int/string/array, strlen , defined 函数。PHP5 都是以扩展函数的方式提供,PHP7中这4类函数改成ZendVM的OPCODE指令,执行更快。
除了上面优化点之外,PHP7还有其他更多的细节性能优化。
网友评论