Code前端首页关于Code前端联系我们

从 PHP 5 到 PHP 7 的完整性能评估(包括与 PHP 8 未发布的 JIT 版本的比较)

terry 2年前 (2023-09-25) 阅读数 50 #后端开发

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 基准测试结果如下所示:

PHP 5到PHP 7性能全评测(含未发布的JIT版PHP 8对比)

PHP 5到PHP 7性能全评测(含未发布的JIT版PHP 8对比)

当然,这些只是 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前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门