责任编辑是最初是来自国外的这篇:PHP Performance Evolution 2016从PHP 5到PHP 7操控性全点评(含未正式宣布发布的JIT版PHP 8对比), 稍稍调整了文件格式而成。
编者按:PHP 是 Web 合作开发最常用的词汇,每个大版的预览都增添不少新特性和操控性提高。特别是 PHP 7.0 的正式宣布发布,增添 PHP 操控性脱胎换骨。责任编辑作者对各个 PHP 版进行了 CPU 操控性基准测试,因此增添了PHP说行大版的消息。责任编辑英文版由高可用构架义工译者。
自 1994 年 Rasmus Lerdorf 建立 PHP 年来, PHP 词汇历经了很多改良,其中操控性是合作开发者在评估新版时考虑的主要标准之一。
阅读这首诗,可以介绍从 PHP 5 到 7(主要包括 7.1)的操控性提高,同时也将介绍到即将重新加入到 PHP 8 的实验性的 JIT 分支版的操控性。
概要
责任编辑将根据时间作出预览,减少更多信息和基准测试结果,主要包括尚未正式宣布发布的新版,以便更快地介绍多年来 PHP 操控性演变。如果您有订正或建议改良,请在zignan回帖。 自 1994 年 Rasmus Lerdorf 建立 PHP 年来, PHP 词汇历经了激烈的重构。尽管第三版是一个简单的一人合作开发的 CGI 程序,Rasmus Lerdorf、Andi Gutmans 和 Zeev Suraski 重新加入了该词汇的第二个版的合作开发,并根本性重新结构设计。从那时起, PHP 合作开发组也建立并产业发展出来。 随著工程项目的产业发展,由于 PHP 3 天然的扩展性, PHP 在核心和附带扩展合作开发的机能得到了飞速产业发展,如存储设备,导出,内存和资料库全力支持。 词汇本身也在产业发展,增添了一连串的改良。这主要包括全力支持程序语言的结构,例如类,USB, traits,旋量群等。 对很多合作开发者来说,仅有新机能是不够的。随着词汇愈来愈畅销, PHP 街道社区对提供更多更快操控性,扩展性和更慢内存采用的市场需求愈来愈强烈。 PHP 合作开发工程项目组近 20 年来一直致力于解决这些市场需求,尽管 PHP 3 的导入大大降低了操控性,但直到 Andi Gutmans 和 Zeev Suraski 导入 Zend Engine 并正式宣布发布 PHP 4, PHP 的操控性才开始变得正式宣布出来。 2000 年推出的捷伊内存C++和开伞器数学模型大大降低了 PHP 的操控性(提高了 5 倍即使 10 倍),并首次被正式宣布的 Web 插件和公交站点所采用。我们可以说,今天 PHP 的成果远远超出了其他人在 PHP 工程项目诞生时的期许。 PHP 的飞速产业发展减少了改善性能的冲动。幸运地的是, Zend Engine 中结构设计的数学模型为持续强化操控性提供更多了良好的基础。 尽管 PHP 5.0 没有增添根本性的操控性提高,因此在某些情况下即使比 PHP4 很慢,一个由 Dmitry Stogov 领导的工程项目组在街道社区的大力帮助下已经在先期版中不断强化词汇,在 PHP 5.6 正式宣布发布的时候,在大多数情况下,操控性提高在 1.5x 和 3x 之间。 2015 年 12 月, PHP 7.0 取得了重大成果。 2016 年 12 月,7.1 版也增添了一连串增强机能。
PHP 8 操控性展望未来
这是一个前途光明的版,目前正在合作开发当中,由 Zend 的 Dmitry Stogov 主导。尽管它是基于 PHP 7.1 版基础,但实际版号尚未定义,所以责任编辑称这个版为“试验 JIT”分支下。 关键机能 JIT(Just-In-Time)编译,是一种将代码转换为另一种字节码(比如运行它的机器 CPU 的本地代码)的技术。 JIT 可以使程序运行更快。 责任编辑涵盖了几个基准测试的结果,从 PHP 5 的第一个版到 PHP 的实验性 JIT 分支版,PHP 5 之前的版操控性责任编辑不作介绍。 在写这首诗的时候,我们很难确定 PHP 8 之前是否会有另一个主要版,比如 PHP 7.2。但是可以假设在 PHP 8 正式宣布发布时,它已经主要包括当前试验版 JIT 分支的强大机能。
PHP 操控性评估
本文只运行纯 CPU 任务脚本的基准测试(不需要I / O操作的任务例如访问文件,网络或资料库连接)。 采用的基准测试脚本如下所示:
基准脚本仅采用每个PHP主要版的最新小版运行。因此,测试的版如下:
当然,我想确定,我们在相同的基准上运行所有小版,例如在 5.3.0 到 5.3.29 之间。结果是有说服力的:操控性方面的主要增强不是由小版增添的,而是主要版号的变化,例如从 PHP 5.4 到 PHP 5.5,或从PHP 5.6 到 PHP 7。 小版没有显示任何明显的操控性改良。这意味着相同的脚本应该以相同的速度运行,无论您采用 PHP 5.4.0 还是 PHP 5.4.45。 您可以查看基准进程部分,详细说明主机系统的设置,各个基准的运行方式以及如何解释时序结果。
纯 CPU 基准测试结果
这部分给出了每个 PHP 版的基准测试结果。 每个基准列显示 3 个值:
时间: 执行时间,以秒和毫秒为单位%rel, gain:相对以前的版收益的执行时间。 在下面的表格中,例如,%rel。 bench.php 和版 5.3.29 的收益是 31.89%,意味着该脚本比 5.2.17 版运行快 31.89%。%abs, gain:与 PHP 5.0 相比脚本运行的收益。 如果你看看bench.php 和实验性的 JIT 分支的这个列的交集,你会注意到,对这个特定的测试基准,PHP 8 比 PHP 5.0 快 41 倍以上。纯CPU基准测试的结果如下所示:
(1)测试不能在 5.3 之前的版上运行,因为它采用了尚未实现的对象机能。
(2)此列中的结果有点偏颇,因为基准需要至少 PHP 5.3 运行。把它们当成纯粹说明,因为他们不能与 PHP 5.0 操控性进行比较。
(3)这是一个 mandelbrot.php 脚本的修改版,它运行得太快,在 7.1.0 和试验 JIT 分支无法准确的统计时间,我们在脚本中运行计算 100 次而不是 1 次。
当然,这些都是纯 CPU 的基准测试。它们不涵盖 PHP 操控性的所有方面,它们可能不代表真实情况。但是结果足够显著,足以说明几个方面的问题:
PHP 5.1 将 PHP 5.0的 操控性提高了一倍多5.2 和 5.3 增添了他们自己的一些操控性增强,但他们没有像5.1版那样引人注目。5.4 版是一个大的操控性改良。(这里有我曾经分享过的PHP5.4的操控性强化的演讲PPTPHP-5.4 Performance)opcache 扩展插件与 5.5 和 5.6 版捆绑在一起。当相同的脚本在 Web 服务器连续运行时,由于更快的代码加载会增添操控性增强。但是,opcache 不会真正显示其在CLI模式下执行脚本的优势。PHP 7.0 是操控性方面的一个重大成果。 Zend Engine 已经完全重新结构设计,我们可以在这里看到这项工作的结果。(这里有我曾经分享过的PHP7的操控性强化的演讲的PPT The secret of PHP7s Performance )PHP 7.1 在 opcache 扩展中导入了 opcode 强化。这再次解释了上述表格中当与 7.0 相比时,操控性的增益。(这里有我曾经分享过的PHP7.1的操控性强化的演讲PPTPHP 7.1s New Features and Performance试验 JIT 分支是另一个重大成果,JIT 可以对现有代码提供更多很大的操控性改良,但在某些情况下,你可能会注意到速度提高只有几个百分点,在最坏的情况下,它即使可能会变慢,因为编译不会生成更快的代码。请记住,此机能目前正在合作开发中。本节介绍了 3 个纯 CPU 基准测试脚本的结果。在运行通常执行的以资料库或文件访问典型场景的 PHP 插件时,它不会给出同样的数字,但我认为他们能够代表您对代码的某些部分期许的操控性改良。
PHP 每个版的操控性提高
PHP 5 相比 PHP 4 增添了明显的改良。 Zend Engine 是 PHP 解释器的核心,它已经完全重新结构设计( Zend Engine 2),为将来的增强机能奠定了基础。责任编辑不多介绍 PHP 4 和 PHP 5 之间的差异,只简要概述的 PHP 5.0 之后发生了什么。 以下部分列出了在先期 PHP 版中的改良。请注意,这里仅列出影响 PHP 核心的修改。有关更完整的描述,请查看 PHP 5 和 PHP 7 的change log。 PHP 5.1
Compiled variablesSpecialized executorReal-path cacheFaster switch() statement handlingFaster array functionsFaster variable fetchesFaster magic method invocationsPHP 5.2
New memory managerOptimized array/HashTable copyingOptimized require_once() and include_once() statementsSmall optimization on specific internal functionsImproved compilation of HEREDOCS and compilation of interpolated stringsPHP 5.3
Segmented VM stackStackless VMCompile-time constants substitutionLazy symbol table initializationReal-path cache improvementImproved PHP runtime speed and memory usageFaster language parsingImproved PHP binary size and code startupPHP 5.4
Delayed HashTable allocationConstant tablesRun-Time binding cachesInterned StringsImproved the output layerImproved ternary operator performance when using arraysPHP 5.5
Improved VM calling conventionOPcache integrationOther misc. optimizations to the Zend EnginePHP 5.6
Optimized empty string handling, minimizing the need to allocate new empty valuesPHP 7.0 下面大部分列出的改良都与 Zend Engine 相关:
Core data structures re-factoringBetter VM calling conventionNew parameters parsing APIYet another new memory managerMany improvements in VM executorSignificantly reduced memory usageImproved __call() and __callStatic() functionsImproved string concatenationImproved character searching in stringsPHP 7.1
New SSA based optimization framework (embedded into opcache)Global optimization of PHP bytecode based on type inferenceHighly specialized VM opcode handlersPHP 8 / 下一代实验性 JIT 分支版
Just-In-Time compiling操控性如何衡量
基准化比单纯运行 Unix 时间命令来测量脚本的执行有所区别。 这就是为什么我历经了以下步骤:
配置系统
首先我设置了一个具有以下特性的专用系统:
一个带有1个2.4GHz虚拟内核,2GB RAM和两个SSD驱动器的VPS,一个用于存储操作系统数据,另一个用于存储各种PHPyuan dai ma,二进制文件和报告输出Debian Wheezy操作系统,版3.2.82-1Gnu CC++版4.9.2-10(Debian Jessie发行版)尽管系统捆绑了Gnu CC++版4.7.2,但需要升级到预览的版。 实验性 JIT 分支必须用Gnu C> = 4.8编译。编译源代码
在构建完整发行版之前,采用以下选项运行配置脚本:
注意,在编译旧版时,上面的一些选项需要被禁用或被其他替代,因此并不是所有的扩展都可用或可以被编译。
运行基准测试
每个基准测试都采用 PHP CLI 专用脚本运行,该脚本遵循以下步骤: 采用 m
执行 2 次运行,以确保 PHP 可执行文件和基准测试脚本内容都在操作系统内存中
运行脚本 5 次,并提取最小,最大和平均运行时间,如脚本报告。 责任编辑仅显示平均运行时间,称之为“脚本运行时间”。
php.ini 文件如下所示:
分析运行结果
采用 Unix time 命令来计时,输出如下所示:
第一个值,real : 是命令开始到终止之间的时间(当你回到 shell 提示符)。
第二个值,user :说明在用户模式中花费的时间(在我们的例子中,这是在 php 可执行文件中花费的时间)。
最后一个值 sys :说明在操作系统(内核)调用中花费的时间。这个值应该是最小的,但是如果你的代码访问缓慢的设备结果会比较大。重负载的操作系统也可能影响此处报告的值。
在空闲系统上通常,数量(user + sys)应该非常接近 real。这是在上面的例子中的情况:user + sys = 1.956s,real 是 1.960s。 0.004s 的差异不属于当前进程:它仅仅意味着操作系统执行任务所花费的额外时间,例如调度。
同一个脚本在一个负载很重的系统上执行,并行编译 3 个不同的 PHP 版:
在这里我清楚地看到,系统本身的重负载对采用的时间(也许在系统时间)有重大影响。 这就是为什么我在这个基准中保留一个额外的值,操作系统开销,这是调用的时间和(用户+系统)时间之间的差。 在纯 CPU 基准测试活动期间,我确保在 99% 以上的时间,这个值严格小于 100 毫秒,即使运行需要几十秒钟完成的脚本。
特别鸣谢
特别鸣谢 Dmitry Stogov 和所有 PHP 核心合作开发者们。 责任编辑是和 Dmitry Stogov 合作完成的 , 他帮助审阅了文章内容 , 来保证这个文章的正确性。 Dmitry Stogov 曾经是 Truck MMCache 的合作开发者,在 PHP4 时代就可以用作共享内存中内存 PHP Opcode,从那时候起,Dmitry Stogov 就重新加入了 Zend,一直到现在。 Dmitry 是 PHP NG 的主要合作开发者 , 也就是我们后来知道的 PHP7, 和 Dmitry 一起合作的有 Xinchen Hui(就是我 :)),Nikita Popov,正是他们在一起合作开发了 PHP7 以及后来的版主要包括 PHP JIT。 在 PHP7 之前 , PHP5 时代的 Andi Gumans, Zeev Suraski 以及 Stas Malishev 等也做了很多的工作来提高 PHP5 的操控性,限于篇幅,责任编辑就不详细介绍。
结论
责任编辑的目的是给你一个不同版PHP操控性的概述,从 5.0 开始,到当前正在合作开发的最新版,采用一组已知的基准脚本。 它还为您提供更多了由每个连续 PHP 版解决的操控性改良方面的列表。 责任编辑将随著捷伊 PHP 版的公布而预览,因此将来会添加捷伊基准测试结果。 我也希望添加一些真实世界的 PHP 插件,如 WordPress 的基准测试结果。 如果您有任何问题或发现不准确,请随时发表评论。 同时,与其他对 PHP 操控性感兴趣的合作开发者分享这首诗。
责任编辑地址: https://www.laruence.com/2016/12/18/3137.html
转载: www.laruence.com/2020/06/12/5902.h…
腾讯T3-T4标准精品PHP构架师教程目录大全,只要你看完保证薪资上升一个台阶(持续预览)
以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提高,对此我整理了一些资料,主要包括但不限于:分布式构架、高可扩展、高操控性、高并发、服务器操控性调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql强化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,官方群点击此处。
部分资料截图:
还有限时精品福利:
★腾讯高级PHP工程师笔试题目
★亿级PV高并发场景订单的处理
★laravel合作开发天猫商城组件服务
★战旗TV视频直播的构架工程项目实战
https://qm.qq.com/cgi-bin/qm/qr?k=tnc-MbbNXPn5psmmPtjh0VPlxH-g4Mtq&authKey=xT5SnnVXhzkkXIIgP0E2YmSexJDtvy0jiVMlSjIb8TbChYuG98yysUeas7jWUy/S&noverify=0
对PHP后端技术,对PHP构架技术感兴趣的朋友,我的官方群点击此处,一起学习,相互讨论。
群内已经有管理将知识体系整理好(源码,学习视频等资料),欢迎加群免费领取。
本课程深度对标腾讯T3-T4标准,贴身打造学习计划为web合作开发者进阶中高级、构架师提高技术,为自己增值涨薪!重新加入BAT特训营还可以获得内推大厂名额以及GO词汇学习权限!!!