当前位置:首页 > 行业 > 正文内容

php编程(PHP的性能演进(从PHP5.0到PHP7.1的性能全评测))

wwwnzt88com2年前 (2022-12-28)行业49

导读:PHP 是 Web 开发最常用的语言,每个大版本的更新都带来不少新特性和性能提升。特别是 PHP 7.0 的发布,带来 PHP 性能飞跃。本文作者对各个 PHP 版本进行了 CPU 性能基准测试,并且带来了PHP下个大版本的消息。本文中文版由高可用架构志愿者翻译。

自 1994 年 Rasmus Lerdorf 创建 PHP 以来, PHP 语言经历了许多改进,其中性能是开发人员在评估新版本时考虑的主要标准之一。

阅读这篇文章,可以了解从 PHP 5 到 7(包括 7.1)的性能提升,同时也将了解到即将加入到 PHP 8 的试验性的 JIT 分支版本的性能。

简介

本文将根据时间作出更新,增加更多信息和基准测试结果,包括尚未发布的新版本,以便更好地了解多年来 PHP 性能演变。如果您有更正或建议改进,请在文后留言。

自 1994 年 Rasmus Lerdorf 创建 PHP 以来, PHP 语言经历了激烈的演进。虽然第一版是一个简单的一人开发的 CGI 程序,Rasmus Lerdorf、Andi Gutmans 和 Zeev Suraski 加入了该语言的第三个版本的开发,并根本性重新设计。从那之后, PHP 开发组也创建并发展起来。

随着项目的发展,由于 PHP 3 天然的可扩展性, PHP 在核心和附加扩展开发的功能得到了蓬勃发展,如网络通信,解析,缓存和数据库支持。

语言本身也在发展,带来了一系列的改进。这包括支持面向对象的结构,例如类,接口, traits,闭包等。

对于许多开发人员来说,仅有新功能是不够的。随着语言越来越受欢迎, 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 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操作的任务例如访问文件,网络或数据库连接)。

使用的基准测试脚本如下所示:

bench.php 可在PHP源代码的 php-src/Zend 目录

micro_bench.php[2] 也可以在 PHP 源代码发布的 php-src/Zend 目录中找到

mandelbrot.php[3]

基准脚本仅使用每个PHP主要版本的最新小版本运行。因此,测试的版本如下:

5.0.55.1.65.2.175.3.295.4.455.5.385.6.287.0.137.1.0开发版 JIT 分支

当然,我想确定,我们在相同的基准上运行所有小版本,例如在 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%。
  • �s, gain:与 PHP 5.0 相比脚本运行的收益。 如果你看看bench.php 和试验性的 JIT 分支的这个列的交集,你会注意到,对于这个特定的测试基准,PHP 8 比 PHP 5.0 快 41 倍以上。

纯CPU基准测试的结果如下所示:

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 版本是一个大的性能改进。(PHP核心开发者鸟哥曾经ppt说明php5.4性能改进的原因[4])
  • opcache 扩展插件与 5.5 和 5.6 版捆绑在一起。当相同的脚本在 Web 服务器连续运行时,由于更快的代码加载会带来性能增强。但是,opcache 不会真正显示其在CLI模式下执行脚本的优势。
  • PHP 7.0 是性能方面的一个重大突破。 Zend Engine 已经完全重新设计,我们可以在这里看到这项工作的结果。(这里有PHP核心开发者鸟哥的ppt说明php 7性能改进的原因[5])
  • PHP 7.1 在 opcache 扩展中引入了 opcode 优化。这再次解释了上述表格中当与 7.0 相比时,性能的增益。
  • 试验 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 variables
  • Specialized executor
  • Real-path cache
  • Faster switch() statement handling
  • Faster array functions
  • Faster variable fetches
  • Faster magic method invocations

PHP 5.2

  • New memory manager
  • Optimized array/HashTable copying
  • Optimized require_once() and include_once() statements
  • Small optimization on specific internal functions
  • Improved compilation of HEREDOCS and compilation of interpolated strings

PHP 5.3

  • Segmented VM stack
  • Stackless VM
  • Compile-time constants substitution
  • Lazy symbol table initialization
  • Real-path cache improvement
  • Improved PHP runtime speed and memory usage
  • Faster language parsing
  • Improved PHP binary size and code startup

PHP 5.4

  • Delayed HashTable allocation
  • Constant tables
  • Run-Time binding caches
  • Interned Strings
  • Improved the output layer
  • Improved ternary operator performance when using arrays

PHP 5.5

  • Improved VM calling convention
  • OPcache integration
  • Other misc. optimizations to the Zend Engine

PHP 5.6

  • Optimized empty string handling, minimizing the need to allocate new empty values

PHP 7.0

下面大部分列出的改进都与 Zend Engine 相关:

  • Core data structures re-factoring
  • Better VM calling convention
  • New parameters parsing API
  • Yet another new memory manager
  • Many improvements in VM executor
  • Significantly reduced memory usage
  • Improved __call() and __callStatic() functions
  • Improved string concatenation
  • Improved character searching in strings

PHP 7.1

  • New SSA based optimization framework (embedded into opcache)
  • Global optimization of PHP bytecode based on type inference
  • Highly specialized VM opcode handlers

PHP 8 / 下一代试验性 JIT 分支版

  • Just-In-Time compiling

性能如何衡量

基准化比单纯运行 Unix 时间命令来测量脚本的执行有所区别。 这就是为什么我经历了以下步骤:

配置系统

首先我设置了一个具有以下特性的专用系统:

  • 一个带有1个2.4GHz虚拟内核,2GB RAM和两个SSD驱动器的VPS,一个用于存储操作系统数据,另一个用于存储各种PHPyuan dai ma,二进制文件和报告输出
  • Debian Wheezy操作系统,版本3.2.82-1
  • Gnu C编译器版本4.9.2-10(Debian Jessie发行版)
  • 虽然系统捆绑了Gnu C编译器版本4.7.2,但需要升级到更新的版本。 试验性 JIT 分支必须用Gnu C> = 4.8编译。
  • 编译源代码
  • 在构建完整发行版之前,使用以下选项运行配置脚本:

--prefix=/usr/local/php--disable-debug--disable-phpdbg--enable-mysqlnd--enable-bcmath--with-bz2=/usr--enable-calendar--with-curl--enable-exif--enable-fpm--with-freetype-dir--enable-ftp--with-gd--enable-gd-jis-conv--enable-gd-native-ttf--with-gettext=/usr--with-gmp--with-iconv--enable-intl--with-jpeg-dir--enable-mbstring--with-mcrypt--with-openssl--enable-pcntl--with-pdo-mysql=mysqlnd--with-png-dir--with-recode=/usr--enable-shmop--enable-soap--enable-sockets--enable-sysvmsg--enable-sysvsem--enable-sysvshm--enable-wddx--with-xmlrpc--with-xsl--with-zlib=/usr--enable-zip--with-mysqli=mysqlnd

  • 注意,在编译旧版时,上面的一些选项需要被禁用或被其他替代,并且并不是所有的扩展都可用或可以被编译。
  • 运行基准测试
  • 每个基准测试都使用 PHP CLI 专用脚本运行,该脚本遵循以下步骤:
  • 使用 microtime()函数从内部获取脚本执行时间。 在此修改后,基准脚本将如下所示:

<?php $__start__ = microtime( true ); /*** original benchmark script code here ***/ fprintf( STDERR, microtime( true ) - $__start__); ?>

  • 执行 2 次运行,以确保 PHP 可执行文件和基准测试脚本内容都在操作系统缓存中
  • 运行脚本 5 次,并提取最小,最大和平均运行时间,如脚本报告。 本文仅显示平均运行时间,称之为“脚本运行时间”。
  • php.ini 文件如下所示:

engine = Onshort_open_tag = Offrealpath_cache_size = 2Mmax_execution_time = 86400memory_limit = 1024Merror_reporting = 0display_errors = 0display_startup_errors = 0log_errors = 0default_charset = "UTF-8"[opcache]zend_extension=opcache.soopcache.enable=1opcache.enable_cli=1opcache.optimization_level=-1opcache.fast_shutdown=1opcache.validate_timestamps=1opcache.revalidate_freq=60opcache.use_cwd=1opcache.max_accelerated_files=100000opcache.max_wasted_percentage=5opcache.memory_consumption=128opcache.consistency_checks=0opcache.huge_code_pages=1// PHP 8/Next onlyopcache.jit=35opcache.jit_buffer_size=32M

  • 分析运行结果
  • 使用 Unix time 命令来计时,输出如下所示:

$ time php bench.phpreal: 0m1.96suser: 0m1.912ssys: 0m0.044s

  • 第一个值,real : 是命令开始到终止之间的时间(当你回到 shell 提示符)。
  • 第二个值,user :说明在用户模式中花费的时间(在我们的例子中,这是在 php 可执行文件中花费的时间)。
  • 最后一个值 sys :说明在操作系统(内核)调用中花费的时间。这个值应该是最小的,但是如果你的代码访问缓慢的设备结果会比较大。重负载的操作系统也可能影响此处报告的值。
  • 在空闲系统上通常,数量(user sys)应该非常接近 real。这是在上面的例子中的情况:user sys = 1.956s,real 是 1.960s。 0.004s 的差异不属于当前进程:它仅仅意味着操作系统执行任务所花费的额外时间,例如调度。
  • 同一个脚本在一个负载很重的系统上执行,并行编译 3 个不同的 PHP 版本:

$ time php bench.phpreal: 0m7.812suser: 0m2.02ssys: 0m0.101s

  • 在这里我清楚地看到,系统本身的重负载对使用的时间(也许在系统时间)有重大影响。
  • 这就是为什么我在这个基准中保留一个额外的值,操作系统开销,这是调用的时间和(用户 系统)时间之间的差。
  • 在纯 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 的性能,限于篇幅,本文就不详细介绍。

扫描二维码推送至手机访问。

版权声明:本文由小草网发布,如需转载请注明出处。

本文链接:http://www.nzt88.com/67619.html

分享给朋友:

“php编程(PHP的性能演进(从PHP5.0到PHP7.1的性能全评测))” 的相关文章

妯娌是什么意思(妯娌是什么意思请解释)

妯娌的意思姗娌:拼音: zhuli; 英语: wivesofbrothers; sisters-in-law; 是指两兄弟妻子之间的关系。 兄弟妻子之间有媳妇这个回答由网友推荐妯娌 是什么意思姗娌(拼音) zhuli,两兄弟妻子的关系。 兄弟的妻子之间是女性。 所以,女性之间的关系,其实是兄弟关系的...

中和反应的定义(中和反应的定义实质)

中和反应的定义(中和反应的定义实质)

中和反应的概念中和反应:酸碱相互交换成分生成盐和水的反应。 中和反应的本质是h和OH-结合生成水( ho )和盐。 酸碱盐水有生成盐和水的反应,不一定是中和反应。 例如,2NaOHco=NaCoHo .所以无论进行到什么程度酸碱反应都称为中和反应。 判断是否完全中和是以酸碱是否正好完全反应为准。...

右手定则怎么用(科氏加速度右手定则怎么用)

请大侠解释一下向量积右手定则如何用,我实在不懂手要怎么转矢量积右手定律的使用方法如下。右手拇指以外的四指合在一起,拇指与其他四指垂直,四指从a矢量方向握向b矢量方向,此时拇指方向为a、b矢量矢量乘积方向。 即,AB的向量积的方向与AB向量所确定的平面垂直。 如下图所示。矢量积,数学中也称为外积、叉积...

以弗得(以弗得是什么意思)

以弗得的介绍以弗得,希伯来语:指在犹太教中担任祭司职务的人穿的特殊服装。米加铸造偶像是犯罪吗米迦是年轻的以法莲人,偷了母亲的银子后,害怕母亲诅咒的灵验,把银子还给母亲。 弥迦的母亲为了减轻咒诅,把银子献给耶和华,但由于她的无知,这些银子被用来铸造偶像。 弥迦不仅铸造偶像、建造神龛、设立圣堂,还制造以...

伊没有单人旁读什么(伊去掉单人旁是读什么)

伊没有单人旁读什么(伊去掉单人旁是读什么)

“伊”去掉单人旁,这字是读隐还是读伊?尹,读尹读伊的话,用老话说明,用虚伪来掩饰。 传达了很多错误的事情,大家也觉得是对的。朴,姓读作PIAO。朴树的原因是朴不是以姓而是以艺名的形式出现的。本回答由提问者推荐伊字去掉单人旁怎么读音读数:[yn]部首:五笔:VTE释义( :1 )治理(以下(天下。2...

一加一加(一加9pro和一加9rt)

一加7pro和一加7tpro有什么区别?两者主要在外观设计、屏幕参数、后置摄像头配置上存在差异。 外观上,在正7t配备水滴屏幕、正7tpro配备真全面屏幕(升降式前置摄像头)的画面上,正7t配备1080P的分辨率,7tpro拥有2K的分辨率的摄像头中,7tpro配备7t的800万像素望远以下详细介绍...

鸦片战争思维导图(两次鸦片战争思维导图)

2018中考历史思维导图(通用版)八年级历史第一课鸦片战争的思维导图知识点:一、十九世纪上半叶英国成为最强大的资本主义国家。 英国为什么要侵略中国?答:为了打开中国市场,销售工业品,掠夺廉价的工业原料(本2页) )。二、英国为什么要向中国走私鸦片?直接目的:牟取暴利根本目的:为了打开中国市场,销售工...

享受泡温泉的优美句子(赞美泡温泉的优美句子)

泡温泉有感的经典句子告诉所有来西海泡春泉的人,当人们还在到处的温泉池中快乐地安顿下来的时候,春意已悄然消融在那热泉中。 人们在池子里闭着眼睛静静地洗澡养神,和七八个朋友一起全身心地聊天,带着父母和孩子,一家三口一起进池子聊天,温暖的感觉就像那池子里闷热的泉水雾2、终于找到了喜欢的地方。 这里刚种了稻...

徙倚怎么读(徙倚怎么读和意思和造句)

"徙倚欲何依"的"徙倚"怎么读依靠过渡[xy]徘徊; 恋恋不舍迁移,中文词汇。 ( (拼音) ) )徘徊,往返,逡巡。《楚辞远游》 (过渡离开思考,害羞心情好。 "王逸注: "感到彷徨、悲伤和愤怒。徙倚怎么读音是什么“迁移”的读法: [xy]意思:徘徊。一、“迁移”基本释义:1 .搬家:搬家~ ~居...

褚民谊(褚民谊 褚孟嫄)

民国历任教育部长历任教育大臣如下。首届部长:蔡元培其他:范源瀛、刘冠雄、陈振先、蕫鸿祎、汪大祚、严修、汤化龙、一枚鹈、张国淦、孙洪伊、范源瀛、傅增湘、袁希涛、傅岳棻、范源瀛;黄炎培、齐耀珊、周自齐、黄炎培、王尧惠、汤尔和、彭允彝、黄郛、范源瀛、张国淦、黄郛、易培基、王九龄、章士钊、易培基、马君武、胡...

外埠是什么意思(邮箱上的本埠和外埠是什么意思)

"外阜"一词是什么意思是外地的意思吗不,外口是中文词,拼音是wib,意思是本地以外的大城市。“出站”是指邮政投递范围以外的地区。 投递区域超出本端口邮政投递范围的邮件为外埠邮件。 所在地以外的银行是外地银行。邮局的外埠和本埠的区别:邮件投递范围所称“本口”,是指地级以上城市以市属城市(市直辖的县和飞...

铁锤的拼音(铁锤的拼音和组词)

槌的拼音是什么锤子的拼音是“[chu]”。 槌的声母为ch,韵母为ui,声调为第二声。一、锤子拼音: chu二.锤子释义:1、敲工具。2、以前是“敲”,敲。3、以前贴蚕箔的木柱。三.槌部首:木四.汉字结构:左右结构五.造字法:形声六、相关短语:棒槌、牙槌、槌杵、槌鼓、蚕槌一、汉字笔顺:横、纵、利、点...

宋史赵普传(宋史赵普传朗读)

宋史赵普传讲了那两件事?赵普半部论语治理天下的故事,体现了他人才的沉重责任1、平时少习吏事,寡学,因相,太祖常劝读书。 晚年不放手卷,每次归我第一,我就闭上家,打开行李箱拿书,读它。 然后第二天临政,处决流程。 藉此,家人拿出行李箱一看,多达《论语》二十篇。 普性深有岸谷,常忌克,但能以天下为己任。...

双旗币拍卖300万(双旗币拍卖价格最近视频)

开国纪念币双旗十文市场价格不高,有一些值得收藏的品种,如何辨识类型和价格?这需要显色,也取决于工作的细致程度,我还是建议请专家看看。1912年,辛亥革命后铜元仍被广泛使用。 但元光绪元宝、清铜币龙纹,帝王色彩浓厚,明显不适合民国。 因此,由稻穗组成的嘉禾图案逐渐被取代,最早的嘉禾图案铜币是开国纪念币...

属相犯月(属相犯月顺口溜正确)

属狗几月是犯月在老一辈人看来,每一个属相都有犯的月,而在那个犯的月出生的人的命运不太好。 所以很多人根据属相出生的月份来看人的命运。 其实这是一种没有科学根据的迷信说法,不值得我们相信。 但是,这个学说多年来深深地影响了许多世代,我们一时也改变不了这个思想,需要理性看待。据说属狗的人,属狗的9月、1...

关宁锦防线(孙承宗关宁锦防线)

皇太极继位后,为何冒险绕过关宁锦防线,突袭明朝京城呢?公元1629年(明崇祯二年,后金天聪三年)十月,皇冠军号十余万,避宁远、锦州,从龙井关、洪山口、大安口冲入关内,攻占遵化(今河北),逼近京师(今北京)。 这一战,被称为后金攻明京畿之战,史料上也称为己巳之变。 明末清初之际,己巳之变无论对明朝,还...