
测试代码是网上找的一个,如下:
$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); } php 7.0 运行 10 次的时间如下(平均: 7075.7503986359ms):
php 7.1.2 运行 10 次(平均: 6934.3298435211ms)
php jit 运行 10 次(平均: 5730.8961868286),当然还有优化空间:将 pow 改成 ** 运算符,将 strval 改用强制类型转换,其运行时间为: 5076.4540433884 ,提升 11.41%)
上面的结果是: jit 的运行速度比 7.1 提升 17.35%, 比 7.0 提升 19%, 7.1 比 7.0 提升 1.99%
1 gouchaoer 2017-02-26 18:32:20 +08:00 via Android |
2 mcfog 2017-02-26 19:06:03 +08:00 还是拿 wordpress 做 benchmark 比较接近实际情况 |
3 peesefoo 2017-02-26 19:11:15 +08:00 via Android 持续关注 |
4 lcqzrl 2017-02-26 19:40:09 +08:00 |
6 tabris17 2017-02-26 20:27:28 +08:00 这个 JIT 版本是官方的吗? |
7 wdlth 2017-02-26 21:21:13 +08:00 试试源代码里面的 bench.php 和 micro_bench.php 。 |
8 mcfog 2017-02-26 21:51:20 +08:00 @akira 绝大多数现实应用同样如此,鸟哥宣传 php7 性能的时候也一直拿 wordpress 评测来说的 真的要做纯运算的测试,建议也还是用官方的 https://github.com/php/php-src/blob/master/Zend/bench.php |
9 robsong 2017-02-27 11:56:59 +08:00 why benchmark use wordpress |
10 szopen OP |
11 jhdxr 2017-02-27 13:56:02 +08:00 当时 5.6 的时候就做了一版 jit 的,单纯只看纯运算的提升,当时就非常大了。但是对于例如 WordPress 之类的实际项目几乎没有提升,所以才没有 merge 。 7.x 虽然加入了 scalar type declarations ,但是实际项目中用上的还不多,我对 jit 的效果还是存疑的。。。 |
12 abcbuzhiming 2017-03-03 23:37:11 +08:00 jit 本身就是这么牛,否则你们以为 node.js 为啥这么快,但是用 jit 会失去 php 的一个重要特性,热部署和热更新,其实这挺纠结的 |
13 gouchaoer 2017-03-04 10:03:50 +08:00 via Android @abcbuzhiming jit 在 cpu 密集型的应用中才有优势,尤其是缺乏类型的脚本语言的 jit 。。。不是 nodejs 快,是异步回调方法在 io 上有优势,相应的 callback hell 。。。 php7 的 jit 似乎会作为 opcache 的组件,这说明官方会做成透明的,热部署是肯定的 |
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 方便多了。 |
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 倍的差距不大可能 |