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

2017-02-26 17:48:16 +08:00
 szopen

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

$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%

13730 次点击
所在节点    PHP
16 条回复
gouchaoer
2017-02-26 18:32:20 +08:00
https://github.com/php/php-src/branches

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

真的要做纯运算的测试,建议也还是用官方的
https://github.com/php/php-src/blob/master/Zend/bench.php
robsong
2017-02-27 11:56:59 +08:00
why benchmark use wordpress
szopen
2017-02-27 13:10:29 +08:00
jhdxr
2017-02-27 13:56:02 +08:00
当时 5.6 的时候就做了一版 jit 的,单纯只看纯运算的提升,当时就非常大了。但是对于例如 WordPress 之类的实际项目几乎没有提升,所以才没有 merge 。 7.x 虽然加入了 scalar type declarations ,但是实际项目中用上的还不多,我对 jit 的效果还是存疑的。。。
abcbuzhiming
2017-03-03 23:37:11 +08:00
jit 本身就是这么牛,否则你们以为 node.js 为啥这么快,但是用 jit 会失去 php 的一个重要特性,热部署和热更新,其实这挺纠结的
gouchaoer
2017-03-04 10:03:50 +08:00
@abcbuzhiming jit 在 cpu 密集型的应用中才有优势,尤其是缺乏类型的脚本语言的 jit 。。。不是 nodejs 快,是异步回调方法在 io 上有优势,相应的 callback hell 。。。 php7 的 jit 似乎会作为 opcache 的组件,这说明官方会做成透明的,热部署是肯定的
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
2017-03-20 13:35:24 +08:00
@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
2017-03-20 13:41:14 +08:00
@gouchaoer 剔除扩展和 C 写的 PHP 标注库,自己写的 php 代码, 100 倍差距很正常。如果不剔除, Python 也可以有扩展, js 也有扩展, ruby 也有扩展,个个都能跟 C 一样快。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/343299

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX