从 PHP 5 到 PHP 7 的完整性能评估(包括与 PHP 8 未发布的 JIT 版本的比较)
PHP 凭借在核心和附加扩展中开发的功能而蓬勃发展,例如网络通信、解析、缓存和数据库援助。
语言本身正在发展,带来了一系列的改进。这包括面向对象的构造,例如类、接口、属性、闭包等。支持。
对于许多开发者来说,新服务还不够。随着该语言越来越受欢迎,PHP 社区对更好的性能、可扩展性和更低的内存使用量的需求日益增长。
PHP 开发团队近 20 年来一直致力于解决这些需求。尽管 PHP 3 的引入极大地提高了性能,但直到 Andi Gutmans 和 Zeev Suraski 引入 Zend Engine 并发布 PHP 4 后,PHP 性能才开始腾飞。 。
于 2000 年推出,新的内存编译器和执行模型极大地提高了 PHP 的性能(提高了 5 倍甚至 10 倍),并首先被重要的 Web 应用程序和网站使用。可以说,PHP 今天的成绩远远超出了 PHP 项目诞生时任何人的预期。
PHP 的繁荣增加了人们对提高性能的渴望。幸运的是,Zend Engine 中设计的模型为持续性能优化提供了良好的基础。
虽然 PHP 没有带来显着的性能提升,并且在某些情况下甚至比 PHP4 还慢,但 Dmitry Stogov 领导的团队在社区的大力帮助下,在后续版本中继续优化该语言。在PHP中,当5.6发布时,性能提升在大多数情况下是3倍。
2015年12月,PHP 7.0实现重大突破。 2016年12月的版本也带来了一系列的改进。
PHP 8 性能展望
这是一个充满希望的版本,目前正在由 Zend 的 Dmitry Stogov 领导开发。虽然基于 PHP 的版本库,但未定义实际版本号,因此本文将这个版本称为“实验 JIT”分支。
主要特点 JIT(即时)编译是一种将代码转换为不同类型的字节码(例如运行它的机器 CPU 的本机代码)的技术。 JIT可以使程序运行得更快。
本文讨论了多个基准测试的结果,从 PHP 5 的第一个版本到 PHP 的实验性 JIT 分支版本。本文不讨论 PHP 5 之前版本的性能。
在撰写本文时,很难说 PHP 8 之前是否会出现另一个主要版本,例如 PHP 7.2。但可以假设,当 PHP 8 发布时,它已经包含了当前实验性 JIT 分支的强大功能。
PHP性能评估
本文仅对纯CPU任务脚本(不需要访问文件、访问网络或数据库连接等I/O操作的任务)进行基准测试。
使用的基准测试脚本如下:
基准脚本仅在每个主要 PHP 版本的最新次要版本上运行。因此,经过测试的版本是:
当然,我想确保我们在相同的基准上运行所有次要版本,例如之间。结果不言而喻:最大的性能提升不是来自次要版本,而是来自主要版本号更改,例如 PHP 5.4 到 PHP 5.5 或 PHP 5.6 到 PHP 7。
较小的版本没有显示出任何明显的性能改进。这意味着无论您使用 PHP 5.4.0 还是 PHP 5.4.45,相同的脚本都应该以相同的速度运行。
您可以查看基准测试流程部分,其中详细介绍了如何设置主机系统、运行每个基准测试以及解释计时结果。
纯 CPU 基准测试结果
本部分包含每个 PHP 版本的基准测试结果。
每个基准测试列显示 3 个值:
仅 CPU 基准测试结果如下所示:
当然,这些只是 CPU 参考。它们没有涵盖 PHP 性能的所有方面,并且可能无法反映现实。但结果足以说明几点:
本节介绍 3 个纯 CPU 基准测试脚本的结果。当运行通常执行数据库或文件访问场景的 PHP 应用程序时,它不会给出相同的数字,但我认为它们代表了您可以预期代码的某些部分的性能改进。
每个版本的 PHP 性能改进
与 PHP 4 相比,PHP 5 带来了显着的改进。 PHP解释核心Zend Engine已经完全重新设计(Zend Engine 2),为未来的发展奠定了基础。本文不会过多详细介绍 PHP 4 和 PHP 5 之间的差异,只是简单概述一下 PHP 之后发生的事情。
以下部分列出了后续 PHP 版本中所做的改进。请注意,此处仅列出影响 PHP 核心的更改。有关更完整的描述,请参阅 PHP 5 和 PHP 7 变更日志。下面列出的大部分改进都与 Zend Engine 相关:
PHP
PHP 8 / 下一代 实验性 JIT 分支版本
JIT 分支版本 用于测量脚本执行的 Unix 时间命令。因此,我进行了以下步骤: 配置系统 首先,我设置了一个专用系统,提供以下服务: 虽然系统包含 Gnu C 编译器版本,但需要更新。到较新的版本。实验性 JIT 分支必须使用 Gnu C>= 进行编译。编译源码 -disable -PHPDBGen-Enable-MySQLND -Enable-BCMath -With-BZ2 =/USR -Enable-Calendar-Cur-l-if-Cur-l - Wi --启用 fpm --freetype-dir --启用 ftp --使用 gd --gd-jis-enable
-gd-native-ttf
--with-gettext=/usr
--with gmp
--with iconw
--enable-intl- with--jg- dir
--启用 mbstring
--with mcrypt -- with-png-dir
--with-recode=/usr
--enable-shmop
--enable-soap
--enable-sockets v --enable-sysvsem
--enable-sysvshm
--enable-wddx
--xmlrpc
--z-r --❙♹❀/♹with --启用-zip --with-mysqli=mysqlnd
注意,在编译旧版本时,必须禁用上述某些选项或用其他选项替换,并且并非所有插件都可以编译。
运行基准测试
每个基准测试都使用特定于 PHP CLI 的脚本运行,该脚本遵循以下步骤:
$__start__ = microtime( true );
/gi 这里
***/
fprintf (stderr, microtime (true) - $ __ start __);
?>
文件为:
Engine = on
short_open_tag = off † display_startup_errors = 0
log_errors = 0
default _charset = "UTF-8" [opcache]
zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1级别化
opcache.fast_shutdown=1
opcache.validate_timestamps=1
opcache.revalidate_freq= 60
opcache.use_cwd=1 opcache.max_ wasted_percentage=5
opcache.memory_conspiration=128
opcache.consistency_checks=0
opcache.huge_ code_pages=1
// PHP 8 /仅以下
opcache.jit=35
运行结果分析
使用Unix时间命令,输出为:
$ time php bench.php
real: 0m1.96s
user: 0m1.912s
sys: 0m0.044s,第一个和结束❙时间命令之间的值(如果我们返回shell 提示符 )
第二个值 user : 描述了在用户模式下花费的时间(在我们的例子中,这是在 php 可执行文件中花费的时间)。
最后一个值 sys: 表示操作系统(内核)调用所花费的时间。该值应该很小,但如果您的代码访问速度较慢的设备,则可能会导致更大的值。负载较重的操作系统也会影响此处报告的值。
在空闲系统上,数字(用户 + 系统)通常应该非常接近真实数字。上面的例子就是这样:user + sys = ,real 是 。这种差异与当前进程无关:它只是意味着操作系统需要更多时间来执行调度等任务。
同一个脚本在负载较重的系统上运行,并行编译3个不同的PHP版本:
$时间php bench.php
real:0m7.812s0s0s。 sys : 0m0.101s
这里我清楚地看到系统本身的负载过重对使用的时间(或许是系统时间)有很大的影响。
这就是为什么我在此基准测试中保留一个额外值,即操作系统开销,它是调用时间与(用户 + 系统)时间之间的差值。
在纯 CPU 基准测试活动中,我确保在 99% 以上的时间里该值严格小于 100 毫秒,即使运行需要数十秒才能执行的脚本也是如此。
特别感谢
特别感谢 Dmitry Stogov 和所有核心 PHP 开发人员。
本文是与 Dmitry Stogov 合作撰写的。帮助审阅文章内容,保证文章的准确性。
Dmitry Stogov 曾经是 Truck MMCache 的开发者,这是一个共享内存中的 PHP4 时代的 PHP 操作码缓存。此后,Dmitry Stogov 加入 Zend 至今。
Dmitry 是 PHP NG(后来称为 PHP7)的主要开发人员。惠新晨(鸟哥)和尼基塔·波波夫与德米特里一起工作。他们开发了 PHP7 及更高版本,包括 PHP JIT。
在 PHP7 之前,Andi Gumans、Zeev Suraski 和 Stas Malishev 即使在 PHP5 时代也为提高 PHP5 的性能做了很多工作。由于篇幅限制,本文不做详细介绍。
结论
本文旨在使用已知的基准脚本提供不同版本 PHP 的性能概述,从当前正在开发的最新版本开始一直到当前正在开发的最新版本。
此外,它还提供了每个 PHP 版本的性能改进列表。
本文将随着新 PHP 版本的发布而更新,并且未来将添加新的基准测试结果。我还想添加一些来自真实 PHP 应用程序(如 WordPress)的基准测试结果。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。