测试代码是网上找的一个,如下:
$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);
}
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 倍的差距不大可能 |