前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【黄啊码】PHP7为什么比PHP5快两倍?

【黄啊码】PHP7为什么比PHP5快两倍?

原创
作者头像
黄啊码
发布2022-06-10 10:14:32
5950
发布2022-06-10 10:14:32
举报

在一般的程序语言的编译中加入 JIT 已属不易,Rasmus Lerdorf 表示,由于 PHP 的动态属性(dynamic)让加入 JIT 是难上加难。他举例,开发者宣告参数a值为1,但不代表程序所有的a 值为 1,但不代表程序所有的a值为1,但不代表程序所有的 a 的值都为 1,由于 PHP 中参数值可以很轻易地重新定义。在 C 语言中,当开发者宣告参数 a 为整数,则 a 永远为整数。如果程序中有任何地方宣告 a 是整数以外 的类型,连编译都无法执行。而因为 C 语言此种强型别的程序语言,「JIT 可以预测变量 a 为整数,但是在 PHP 中,我们没有这种奢侈。」他解释,HHVM 的 做法为当 JIT 得知 a 是整数型别后,则假设 a 永远为整数。

而 HHVM 为了在使用 JIT 编译,某种程度上受限了 PHP 的发展。HHVM 的用户必须清楚宣告变量的性质,但是使用 PHP 的开发者,可以先宣告没有性质的 类别(Class),后续再指定类别的变量属性。「在没有任何限制下,将 JIT 加入 PHP 是我们要做的事。」他表示,PHP 必须顾及 WordPress、 Drupal 等框架的开发者,不能任意停止对此些框架的支持。故与 HHVM 相比,PHP 在打造 JIT 的条件限制更多。

但是,「这不代表我们不能做 JIT。此外,我们也要控制 PHP 的发展走向。」Rasmus Lerdorf 表示。

目前,PHP 核心贡献者之一的 Dmitry Stogov 开发一个原型 JIT,并且使用某些实验性的应用程序去测试运作。Rasmus Lerdorf 表示,如果将此 JIT 用于执行某些重复性的运算或是循环程序,得以让 PHP 7 性能又再快上 10 倍。

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[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指令,执行更快。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档