最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 带 JIT 的 PHP 8 发布了! 我们来跑个分~

    正文概述 掘金(karminski牙医)   2020-11-27   653

    php8 Benchmark the Brainfuck Way

    这篇文章的 demo 源码可以在我的 Github 找到: github.com/karminski/P…

    PHP8 已经发布了, 带来了全新的, 令人兴奋的 JIT 编译引擎. 根据官方文档描述: "它在综合基准测试中的性能提高了大约 3 倍, 在某些特定的长期运行的应用程序中提高了 1.5-2 倍. 典型的应用程序性能与 PHP 7.4 相当.".

    官方性能测试结果如下图:

    带 JIT 的 PHP 8 发布了! 我们来跑个分~

    那么实际情况如何?

    于是我写了个简单的跑分 demo, 是一个从 Go 语言移植过来的 brainfuck 语言 解释器.

    源码见: run.php. 里边顺便还包含了 brainfuck 实现的 曼德博集合(Mandelbrot set). 程序即用 PHP 编写的 brainfuck 语言解释器运行 brainfuck 编写的生成曼德博集合的程序. 然后计时并比较其性能.

    我的机器配置为: Intel(R) Core(TM) i5-7600K @3.8GHz.

    PHP 7.4.1 测试结果

    带 JIT 的 PHP 8 发布了! 我们来跑个分~

    PHP 8.0.0 测试结果

    带 JIT 的 PHP 8 发布了! 我们来跑个分~

    结论

    从测试数据看, PHP 7.4.1 耗时 14m0.138s, PHP 8.0.0 耗时 11m36.697s. 单从这一测试结果讲, 性能提升了 1.2 倍. demo 程序大部分时间都在做 $foo++;, $foo--;, 数组查找并赋值这样的操作, 其中最多的 op_inc_dp 逻辑, 即 $dataPtr++; 执行了 4,453,036,023 次.

    带 JIT 的 PHP 8 发布了! 我们来跑个分~

    如果 PHP 8 的确使用了 DynASM, 那么根据我对 DynASM 的实践和理解, 最简单且行之有效的优化方式是, 尽量提前初始化变量. 即:

    $data = array();
    $dataPtr = 0;
    for($i=0;$i<65535;$i++){  <--------------------------------+
        $data[$i] = 0;                                         |
    }                                                          |
    for($pc = 0; $pc < count($program); $pc++){                |
        // if(empty($data[$dataPtr])) $data[$dataPtr] = 0; ----+
        switch ($program[$pc][self::operator]) {
            case self::op_inc_dp:
    

    将判断 $data 是否为空然后再初始化这里修改为直接初始化 $data 为一个长度为 65535 的数组. (当然本身这个判断也是很耗费性能的, 具体是否经过了 JIT 还不得而知, 我接下来会更详细的测试并阅读源码, 来了解 PHP 8 JIT 是如何运作的.).

    这样修改后, 运行时间缩小到了 8m34.111s, 同样 PHP 7.4.1 耗时为 9m44.762s 性能提升了 1.137 倍.

    就本次测试结果而言, PHP 8 引入了 JIT 的性能提升是显著的. 这为 PHP 带来了新的可能性. 但同时我们也看到官方测试中, 一些复杂的应用 (比如WordPress) 提升很微弱. 目前还不知道是因为 JIT 仍处于初期阶段导致性能提升不显著, 还是因为 WordPress 由于是既存项目, 代码不可能为 JIT 专门优化过而导致性能提升不明显. 这部分还需要通过详细的 benchmark (比如使用火焰图) 来进行研判.

    作为一个从 PHP 4 一路使用过来的老用户, 对 PHP 的感情是复杂的, PHP 现在十分缺乏一个强力的生态来重新唤醒. 而这需要广大 PHPer 的共同努力. 期待未来 PHP 能有更好的表现.

    Reference

    • The Original brainfuck interpreter source code
    • The mandelbrot set fractal viewer in brainfuck written by Erik Bosman

    License

    • The MIT License (MIT)

    One more thing

    顺便这个程序的 Go 测试结果为:

    带 JIT 的 PHP 8 发布了! 我们来跑个分~

    虽然有点不讲武德 (这么对比没什么意义, go 到 Plan9 ASM 再到机器码比 PHP 少了太多东西, 速度快是必然), 不过, 不到18秒......


    起源地下载网 » 带 JIT 的 PHP 8 发布了! 我们来跑个分~

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元