今天测试了一下 PHP 7.0, PHP 7.1.2, PHP -jit 的性能,发现 jit 提升速度很可观啊 - V2EX
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 14380 次点击
    这是一个创建于 3228 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    $t1 = microtime(true); for ($i = 0; $i < 10000000; $i++) { aaa($i); } $t2 = microtime(tru); 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     Solana     2984 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 42ms UTC 13:22 PVG 21:22 LAX 05:22 JFK 08:22
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86