V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
szopen
V2EX  ›  PHP

今天测试了一下 PHP 7.0, PHP 7.1.2, PHP -jit 的性能,发现 jit 提升速度很可观啊

  •  1
     
  •   szopen · 2017-02-26 17:48:16 +08:00 · 13888 次点击
    这是一个创建于 2830 天前的主题,其中的信息可能已经有所发展或是发生改变。

    测试代码是网上找的一个,如下:

    $t1 = microtime(true);
    for ($i = 0; $i < 10000000; $i++) {
        aaa($i);
    }
    $t2 = microtime(true);
    echo 'php time:' . ($t2 - $t1) * 1000 . "ms\n";
    function aaa($i) {
        $a = $i + 1;
        $b = 2.3;
        $s = "abcdefkkbghisdfdfdsfds";
    
        if ($a > $b) {
            ++$a;
        } else {
            $b = $b + 1;
        }
    
        if ($a == $b) {
            $b = $b + 1;
        }
        $c = $a * $b + $a / $b - pow($a, 2);
        $d = substr($s, 0, strpos($s, 'kkb')) . strval($c);
    }
    
    
    1. php 7.0 运行 10 次的时间如下(平均: 7075.7503986359ms):

      • php time:8072.5648403168ms
      • php time:6939.5442008972ms
      • php time:7191.8301582336ms
      • php time:6945.8959102631ms
      • php time:6882.6849460602ms
      • php time:7032.8409671783ms
      • php time:6811.5448951721ms
      • php time:6672.425031662ms
      • php time:6793.6861515045ms
      • php time:7414.4868850708ms
    2. php 7.1.2 运行 10 次(平均: 6934.3298435211ms)

      • php time:7199.9051570892ms
      • php time:6994.499206543ms
      • php time:6757.4181556702ms
      • php time:6789.9668216705ms
      • php time:6769.6089744568ms
      • php time:6939.1942024231ms
      • php time:7054.6488761902ms
      • php time:7051.059961319ms
      • php time:7018.3329582214ms
      • php time:6768.6641216278ms
    3. php jit 运行 10 次(平均: 5730.8961868286),当然还有优化空间:将 pow 改成 ** 运算符,将 strval 改用强制类型转换,其运行时间为: 5076.4540433884 ,提升 11.41%)

      • php time:5733.3748340607ms
      • php time:5658.3139896393ms
      • php time:5625.147819519ms
      • php time:5610.3270053864ms
      • php time:5665.7960414886ms
      • php time:5727.0920276642ms
      • php time:6207.0441246033ms
      • php time:5648.952960968ms
      • php time:5796.0541248322ms
      • php time:5636.8589401245ms

    上面的结果是: jit 的运行速度比 7.1 提升 17.35%, 比 7.0 提升 19%, 7.1 比 7.0 提升 1.99%

    16 条回复    2017-03-20 13:41:14 +08:00
    gouchaoer
        1
    gouchaoer  
       2017-02-26 18:32:20 +08:00 via Android
    https://github.com/php/php-src/branches

    我没看到 php7 的 jit 分支啊,这玩意儿说是要合并到 master ,已经放出了么?
    mcfog
        2
    mcfog  
       2017-02-26 19:06:03 +08:00
    还是拿 wordpress 做 benchmark 比较接近实际情况
    peesefoo
        3
    peesefoo  
       2017-02-26 19:11:15 +08:00 via Android
    持续关注
    lcqzrl
        4
    lcqzrl  
       2017-02-26 19:40:09 +08:00
    akira
        5
    akira  
       2017-02-26 20:20:10 +08:00
    @mcfog wordpress 收到数据库方面的影响更大
    tabris17
        6
    tabris17  
       2017-02-26 20:27:28 +08:00
    这个 JIT 版本是官方的吗?
    wdlth
        7
    wdlth  
       2017-02-26 21:21:13 +08:00
    试试源代码里面的 bench.php 和 micro_bench.php 。
    mcfog
        8
    mcfog  
       2017-02-26 21:51:20 +08:00
    @akira 绝大多数现实应用同样如此,鸟哥宣传 php7 性能的时候也一直拿 wordpress 评测来说的

    真的要做纯运算的测试,建议也还是用官方的
    https://github.com/php/php-src/blob/master/Zend/bench.php
    robsong
        9
    robsong  
       2017-02-27 11:56:59 +08:00
    why benchmark use wordpress
    szopen
        10
    szopen  
    OP
       2017-02-27 13:10:29 +08:00
    jhdxr
        11
    jhdxr  
       2017-02-27 13:56:02 +08:00
    当时 5.6 的时候就做了一版 jit 的,单纯只看纯运算的提升,当时就非常大了。但是对于例如 WordPress 之类的实际项目几乎没有提升,所以才没有 merge 。 7.x 虽然加入了 scalar type declarations ,但是实际项目中用上的还不多,我对 jit 的效果还是存疑的。。。
    abcbuzhiming
        12
    abcbuzhiming  
       2017-03-03 23:37:11 +08:00
    jit 本身就是这么牛,否则你们以为 node.js 为啥这么快,但是用 jit 会失去 php 的一个重要特性,热部署和热更新,其实这挺纠结的
    gouchaoer
        13
    gouchaoer  
       2017-03-04 10:03:50 +08:00 via Android
    @abcbuzhiming jit 在 cpu 密集型的应用中才有优势,尤其是缺乏类型的脚本语言的 jit 。。。不是 nodejs 快,是异步回调方法在 io 上有优势,相应的 callback hell 。。。 php7 的 jit 似乎会作为 opcache 的组件,这说明官方会做成透明的,热部署是肯定的
    sagaxu
        14
    sagaxu  
       2017-03-05 00:03:15 +08:00
    这个 benchmark 并不能体现 JIT 的优势,因为耗时比较多的 substr 和 strpos 以及 strval 已经是 C 实现的了,这部分有没有 JIT 性能都一样。

    我把迭代次数放大到 100000000 次,原始版本在 php7.0 下面耗时 45.7 秒,去掉.strval($c)后耗时 16.8 秒,进一步去掉 substr 和 strpos 后耗时 10.8 秒,而 JIT 能改善的空间,就是这 10.8 秒,即便时间变为 0 ,也只是从 45.7 秒变为 34.9 秒,提升有限。

    换成相应的 JAVA 实现,原始版本耗时 21 秒,去掉 strval 后是 1.3 秒,完全去掉字符串查找和截取子串后,耗时仅 100 毫秒。

    PHP 和 Java 在不涉及 C 编写的函数,只跑以上纯 CPU 代码时, 7.0 比 Java 慢 100 倍以上, JIT 实现的好,这部分差距可以减少到 10 倍以内,局部改善还是相当可观的。当然了,指望 PHP 的 VM 在短期内能赶上 JVM ,不大现实, JVM 是耗资数千万美金才有今天的能力, PHP 缺乏这样的投入,除了 JIT ,还有一个就是 GC , PHP 短期内也没法拥有 JVM 那样的 GC 。比 JIT 和 GC 更难以解决的,是多线程时的 GIL ,如果没有 GIL , php 和 python 做个进程内的 cache 方便多了。
    gouchaoer
        15
    gouchaoer  
       2017-03-20 13:35:24 +08:00 via Android
    @sagaxu php 有 gil 么?你忘了 php 多线程版本存在的理由就是 win 下 iis 的多线程模型的。。。至于那个跑纯 cpu 代码 java 性能是 php 的 100 倍这个不大可能哦,前面你也说了 strpos 之类的 c 函数本身就是已经做到最优了,于是有人用 zephir 来写逻辑业务(本质上是编译成 c 扩展),最后测出来性能和纯 c 差不多: https://github.com/phalcon/zephir/issues/694

    当然你可以说 zephir 翻译成的 c 扩展效率不高啥的,但是 100 倍的差距不大可能
    sagaxu
        16
    sagaxu  
       2017-03-20 13:41:14 +08:00 via Android
    @gouchaoer 剔除扩展和 C 写的 PHP 标注库,自己写的 php 代码, 100 倍差距很正常。如果不剔除, Python 也可以有扩展, js 也有扩展, ruby 也有扩展,个个都能跟 C 一样快。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3131 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 00:36 · PVG 08:36 · LAX 16:36 · JFK 19:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.