PHP 8 能有多快?

2020 年 2 月 17 日 CSDN
PHP-8将于今年年底发布,其最令人期待的功能之一就是JIT编译。让我们通过本文来看看这项功能对PHP脚本的速度有怎样的影响?

作者 | Pedro Escudero

译者 | 弯月,责编 | 郭芮

出品 | CSDN(ID:CSDNnews)

以下为译文:
今年年底,PHP-8即将发布。虽然这个主版本有很多新功能,例如联合类型、静态返回和弱映射等,但最令人期待的改进还是JIT编译器。
从理论上讲,JIT处理PHP脚本编译的方式能够提高应用程序的速度。但让我们来看看这种方法能否达到我们的期望。
请注意,在本文中使用的PHP-8不是最终版本。
首先,我们来编写一段运行的代码。我选择了冒泡排序,因为这是最差的排序算法,只有这种测试的时候我才能用这个排序算法。
<?php
function bubble_sort($array)
{
  $start = microtime(true);
    do
    {
        $sw = false;
        for($i = 0, $size = count($array) - 1; $i < $size; $i++)
        {
            if( $array[$i] > $array[$i + 1] )
            {
                list( $array[$i + 1], $array[$i] ) =
                        array($array[$i], $array[$i + 1]);
                $sw = true;
            }
        }
    }
    while($sw);
$end = microtime(true);
return $end - $start;
}
$array = array(1000-202302775-1434-20310.5 , -30.88,
 40004440.99-444454443-4444423-201,
 50004440.99-4444553-4253-201,
 60004440.99-444443-42.3-2.01,
 390004440.99-44453-423-201,
 3099004440.9923123453-423-201,
 3099004440.99-4.144453-423-201,
 3099004440.99-4.444453-423-201,
 3050011440.99-4.44453-423-201,
 -3000-4440.99-444453-423-1,
 30004240.19-444453-423-21,
 3004540.99222-444453-423-20.1,
 30111044420.991-444453-42.443-201,
 3033300334440.49-444453-42.4443-201,
 40004440.99-444454443-4444423-201,
 50004440.99-4444553-4253-201,
 60004440.99-444443-42.3-2.01,
 390004440.99-44453-423-201,
 3099004440.9923123453-423-201,
 3099004440.99-4.144453-423-201,
 3099004440.99-4.444453-423-201,
 3050011440.99-4.44453-423-201,
 -3000-4440.99-444453-423-1,
 30004240.19-444453-423-21,
 3004540.99222-444453-423-20.1,
 30111044420.991-444453-42.443-201,
 3033300334440.49-444453-42.4443-201,
 40004440.99-444454443-4444423-201,
 50004440.99-4444553-4253-201,
 60004440.99-444443-42.3-2.01,
 390004440.99-44453-423-201,
 3099004440.9923123453-423-201,
 3099004440.99-4.144453-423-201,
 3099004440.99-4.444453-423-201,
 3050011440.99-4.44453-423-201,
 -3000-4440.99-444453-423-1,
 30004240.19-444453-423-21,
 3004540.99222-444453-423-20.1,
 30111044420.991-444453-42.443-201,
 3033300334440.49-444453-42.4443-201,
 40004440.99-444454443-4444423-201,
 50004440.99-4444553-4253-201,
 60004440.99-444443-42.3-2.01,
 390004440.99-44453-423-201,
 3099004440.9923123453-423-201,
 3099004440.99-4.144453-423-201,
 3099004440.99-4.444453-423-201,
 3050011440.99-4.44453-423-201,
 -3000-4440.99-444453-423-1,
 30004240.19-444453-423-21,
 3004540.99222-444453-423-20.1,
 30111044420.991-444453-42.443-201,
 3033300334440.49-444453-42.4443-201,
 40004440.99-444454443-4444423-201,
 50004440.99-4444553-4253-201,
 60004440.99-444443-42.3-2.01,
 390004440.99-44453-423-201,
 3099004440.9923123453-423-201,
 3099004440.99-4.144453-423-201,
 3099004440.99-4.444453-423-201,
 3050011440.99-4.44453-423-201,
 -3000-4440.99-444453-423-1,
 30004240.19-444453-423-21,
 3004540.99222-444453-423-20.1,
 30111044420.991-444453-42.443-201,
 3033300334440.49-444453-42.4443-201,
 40004440.99-444454443-4444423-201,
 50004440.99-4444553-4253-201,
 60004440.99-444443-42.3-2.01,
 390004440.99-44453-423-201,
 3099004440.9923123453-423-201,
 3099004440.99-4.144453-423-201,
 3099004440.99-4.444453-423-201,
 3050011440.99-4.44453-423-201,
 -3000-4440.99-444453-423-1,
 30004240.19-444453-423-21,
 3004540.99222-444453-423-20.1,
 30111044420.991-444453-42.443-201,
 3033300334440.49-444453-42.4443-201,
 40004440.99-444454443-4444423-201,
 50004440.99-4444553-4253-201,
 60004440.99-444443-42.3-2.01,
 390004440.99-44453-423-201,
 3099004440.9923123453-423-201,
 3099004440.99-4.144453-423-201,
 3099004440.99-4.444453-423-201,
 3050011440.99-4.44453-423-201,
 -3000-4440.99-444453-423-1,
 30004240.19-444453-423-21,
 3004540.99222-444453-423-20.1,
 30111044420.991-444453-42.443-201,
 3033300334440.49-444453-42.4443-201,
 40004440.99-444454443-4444423-201,
 50004440.99-4444553-4253-201,
 60004440.99-444443-42.3-2.01,
 390004440.99-44453-423-201,
 3099004440.9923123453-423-201,
 3099004440.99-4.144453-423-201,
 3099004440.99-4.444453-423-201,
 3050011440.99-4.44453-423-201,
 -3000-4440.99-444453-423-1,
 30004240.19-444453-423-21,
 3004540.99222-444453-423-20.1,
 30111044420.991-444453-42.443-201,
 3033300334440.49-444453-42.4443-201,
 40004440.99-444454443-4444423-201,
 50004440.99-4444553-4253-201,
 60004440.99-444443-42.3-2.01,
 390004440.99-44453-423-201,
 3099004440.9923123453-423-201,
 3099004440.99-4.144453-423-201,
 3099004440.99-4.444453-423-201,
 3050011440.99-4.44453-423-201,
 -3000-4440.99-444453-423-1,
 30004240.19-444453-423-21,
 3004540.99222-444453-423-20.1,
 30111044420.991-444453-42.443-201,
 3033300334440.49-444453-42.4443-201,
 40004440.99-444454443-4444423-201,
 50004440.99-4444553-4253-201,
 60004440.99-444443-42.3-2.01,
 390004440.99-44453-423-201,
 3099004440.9923123453-423-201,
 3099004440.99-4.144453-423-201,
 3099004440.99-4.444453-423-201,
 3050011440.99-4.44453-423-201,
 -3000-4440.99-444453-423-1,
 30004240.19-444453-423-21,
 3004540.99222-444453-423-20.1,
 30111044420.991-444453-42.443-201,
 3033300334440.49-444453-42.4443-201,
 40004440.99-444454443-4444423-201,
 50004440.99-4444553-4253-201,
 60004440.99-444443-42.3-2.01,
 390004440.99-44453-423-201,
 3099004440.9923123453-423-201,
 3099004440.99-4.144453-423-201,
 3099004440.99-4.444453-423-201,
 3050011440.99-4.44453-423-201,
 -3000-4440.99-444453-423-1,
 30004240.19-444453-423-21,
 3004540.99222-444453-423-20.1,
 30111044420.991-444453-42.443-201,
 3033300334440.49-444453-42.4443-201,
 40004440.99-444454443-4444423-201,
 50004440.99-4444553-4253-201,
 60004440.99-444443-42.3-2.01,
 390004440.99-44453-423-201,
 3099004440.9923123453-423-201,
 3099004440.99-4.144453-423-201,
 3099004440.99-4.444453-423-201,
 3050011440.99-4.44453-423-201,
 -3000-4440.99-444453-423-1,
 30004240.19-444453-423-21,
 3004540.99222-444453-423-20.1,
 30111044420.991-444453-42.443-201,
 3033300334440.49-444453-42.4443-2010000
);
echo "\n";
echo bubble_sort($array);
echo "\n";
?>

我知道这个脚本编写的并不是很好,尤其是中间那个讨厌的数组。我知道我可以生成一个随机数组。我也知道我可以从文件中读取这个数组。但是,我只想要一个不需要考虑其他因素的非常慢的冒泡算法。我不希望这个基准测试中出现任何额外的干扰。

首先,我们在当前的PHP 7.4版本中运行脚本:
docker container run --rm -v $(pwd):/script/ php:7.4 php /script/bubble.php

运行100次得到的平均时间为0.10253500938416秒——还不错。

现在我们在PHP-8中运行,先不要激活JIT。
docker container run --rm -v $(pwd):/script/ martinpham/php8:fpm-extra-alpine php /script/bubble.php

同样运行100次的平均时间为0.098223924636841秒。老实说,这个提升不怎么明显。

下面,我们来测试期待已久的JIT:
docker container run --rm -v $(pwd):/script/ keinos/php8-jit php /script/bubble.php

平均运行时间为0.053637981414795秒!JIT确实很惊喜!对于像我这样非常关注执行时间的人来说,这简直就是一个福音。虽然单看数字你没什么感觉(仅改善了0.04458594322秒),但换算成百分比后,就能更好地看清优势了:45.39%。

我想从更多的角度来对比,因此我使用了2009年的PHP-5.3版本来运行这段代码。
docker container run --rm -v $(pwd):/script/ php:5.3 php /script/bubble.php

平均花费了0.64574003219604秒。比激活了JIT的PHP-8满了0.5921020508(下降了-1,103.88)!我的天,2009年的时候我们是怎么过来的?

注意:
  • 选择的脚本只有一个纯粹的冒泡算法。当然,你可以尝试其他代码,例如旅行推销员问题或二叉树。结果应该都差不多。

  • 正如我在文中提到的那样,这个基准测试运行的PHP-8版本不是最终版本,因此可能最终的发行版会增添其他改进

  • 我在测试结果中保留了很多位小数,虽然看着很罗嗦,但我只是想尽可能做到精确。

  • 在基准测试中,我使用keinos和martinpham的docker镜像。其实还有很多其他工具,你可以选择自己喜欢的尝试一下。

  • 我运行测试的笔记本电脑的配置为:Linux Manjaro、3 GHz Intel Core i5、32 GB RAM。在其他配置下,具体的数字可能会有所不同,但是我相信改进结果都很相似。

原文:https://levelup.gitconnected.com/how-fast-is-php-8-going-to-be-f7fdc111cd6

作者:Pedro Escudero,工程副总裁@zinio.com。
本文为 CSDN 翻译,转载请注明来源出处。
【End】


推荐阅读 
AI 测温、无人机喊话、机器人防疫,科技抗疫超硬核!
小米 10 年再创业,高端 5G 手机和 AIoT 有多少机会?
AI芯片发展的前世今生
在家办公,我比上班还累你信吗?
利用丁香园数据生成疫情分布地图(R语言)| 博文精选
2019年度区块链安全复盘总结
你点的每一个在看,我认真当成了喜欢


猛戳“ 阅读原文 ”,填写中国远程办公-调查问卷
登录查看更多
0

相关内容

PHP 是英文超级文本预处理语言(PHP:Hypertext Preprocessor)的缩写。PHP 是一种 HTML 内嵌式的语言,是一种在服务器端执行的嵌入 HTML 文档的脚本语言,语言的风格有类似于 C 语言,被广泛的运用。PHP 具有非常强大的功能,所有的 CGI 的功能 PHP 都能实现,而且支持几乎所有流行的数据库以及操作系统。
一份简明有趣的Python学习教程,42页pdf
专知会员服务
76+阅读 · 2020年6月22日
知识图谱推理,50页ppt,Salesforce首席科学家Richard Socher
专知会员服务
105+阅读 · 2020年6月10日
【Manning2020新书】Elm 实战,344页pdf,Elm in Action
专知会员服务
49+阅读 · 2020年4月14日
【ICLR2020-哥伦比亚大学】多关系图神经网络CompGCN
专知会员服务
49+阅读 · 2020年4月2日
AAAI2020接受论文列表,1591篇论文目录全集
专知会员服务
98+阅读 · 2020年1月12日
msf实现linux shell反弹
黑白之道
49+阅读 · 2019年8月16日
GitHub超9千星:一个API调用27个NLP预训练模型
新智元
17+阅读 · 2019年7月22日
度量学习中的pair-based loss
极市平台
65+阅读 · 2019年7月17日
PHP使用Redis实现订阅发布与批量发送短信
安全优佳
7+阅读 · 2019年5月5日
【NIPS2018】接收论文列表
专知
5+阅读 · 2018年9月10日
Python 杠上 Java、C/C++,赢面有几成?
CSDN
6+阅读 · 2018年4月12日
浅谈浏览器 http 的缓存机制
前端大全
6+阅读 · 2018年1月21日
Python 开源项目 Top30 | 值得收藏
人工智能头条
8+阅读 · 2018年1月19日
Arxiv
101+阅读 · 2020年3月4日
Arxiv
4+阅读 · 2019年2月8日
Bidirectional Attention for SQL Generation
Arxiv
4+阅读 · 2018年6月21日
VIP会员
相关VIP内容
一份简明有趣的Python学习教程,42页pdf
专知会员服务
76+阅读 · 2020年6月22日
知识图谱推理,50页ppt,Salesforce首席科学家Richard Socher
专知会员服务
105+阅读 · 2020年6月10日
【Manning2020新书】Elm 实战,344页pdf,Elm in Action
专知会员服务
49+阅读 · 2020年4月14日
【ICLR2020-哥伦比亚大学】多关系图神经网络CompGCN
专知会员服务
49+阅读 · 2020年4月2日
AAAI2020接受论文列表,1591篇论文目录全集
专知会员服务
98+阅读 · 2020年1月12日
相关资讯
msf实现linux shell反弹
黑白之道
49+阅读 · 2019年8月16日
GitHub超9千星:一个API调用27个NLP预训练模型
新智元
17+阅读 · 2019年7月22日
度量学习中的pair-based loss
极市平台
65+阅读 · 2019年7月17日
PHP使用Redis实现订阅发布与批量发送短信
安全优佳
7+阅读 · 2019年5月5日
【NIPS2018】接收论文列表
专知
5+阅读 · 2018年9月10日
Python 杠上 Java、C/C++,赢面有几成?
CSDN
6+阅读 · 2018年4月12日
浅谈浏览器 http 的缓存机制
前端大全
6+阅读 · 2018年1月21日
Python 开源项目 Top30 | 值得收藏
人工智能头条
8+阅读 · 2018年1月19日
Top
微信扫码咨询专知VIP会员