写在前面:完整的评估性能必须要靠更全面的benchmark,micro-benchmark只能说明一部分问题,一般只能提供某种场景下提升的情况。真实的提升离不开真实场景下对应用的测试。
在知乎上看到一个很有意思的PHP 8 JIT版本的benchmark
https://zhuanlan.zhihu.com/p/314783520zhuanlan.zhihu.com
这个实验通过一个Brainfuck解释器 + Brainfuck代码来测试性能,比较有趣,因为很少有这么测试的。当然,本质上还是micro-benchmark,而且测试的性能很单一,主要就是:单变量++/--,数组读,数组读写。
不过这个文章当中犯了个错误,就是PHP 8虽然已经release了,但是默认并不开启JIT,而且手册很具有误导性,因为手册当中写opcache.jit默认设置为开启,然而还有个opcache.jit_buffer_size也要设置为非0值才可以,更不要说官方镜像默认没有加载opcache.so(what???)所以正确测试的命令行是:
php -dzend_extension=opcache.so -dopcache.enable_cli=1 -dopcache.enable=1 -dopcache.jit_buffer_size=100M run.php
PHP也是所有测试语言当中唯一需要单独配置的。
统一给出我这边测试的结果吧,我使用的虚拟机的CPU型号为E5-2667 v3 @ 3.20GHz,要比i5强一点,所以速度也会比上一个作者测试的结果快一些。所有测试使用的binary都是官方docker镜像。
测试项
结果
和上一项的差距
golang:latest(编译后运行)
16.3s
--
nodejs:latest
1m15.0s
x4.60
pypy:3.7(run2.py)
1m23.1s
x1.11
pypy:3.7(run.py)
1m27.9s
x1.06
php:8.0.0RC5-cli(开启JIT)
2m22.2s
x1.62
php:8.0.0RC5-cli(非JIT,Opcache)
5m50.4s
x2.46
php:7.4.12-cli(非JIT)
5m46.5s
x0.99
CPython 3.9(run2.py)
24m57s
x4.32
可以得到以下结论:
PHP 8的JIT在micro benchmark下还可以,但是跟nodejs和PyPy尚有60%的差距,推测是对于单变量++/--的优化力度还可以,但是对访问数组的优化力度不足,实际应用中可能会有更大差距
PHP 8不开启JIT和PHP7差不多,这是开启OpCache的情况下测试的。不开的情况下PHP 8要比PHP 7快一些。
对于弱类型/动态类型语言来说,业界最强JIT node.js还是被编译语言吊起来打(当然,也是仅限micro benchmark),所以不要觉得有JIT了就能比肩C++/golang/Java了。
CPython在这种micro benchmark下是真的拉跨到无以复加,跟PyPy有整整18倍的差距。
注意:Python有两个版本的脚本,差别很小,因为Python没有常量定义语法,所以第一个版本是用类属性代替常量的,第二个版本手动替换成了立即数,第一个版本更接近其它语言的写法,第二个版本更接近其它解释器解释的版本。
使用代码在github上
hubo1016/PHP8-Benchmark-the-Brainfuck-Way
PHP8 JIT性能测试
本文通过Brainfuck解释器测试PHP8的JIT性能,并与其他语言进行对比。结果显示PHP8 JIT在部分基准测试中有较好的表现,但仍与Node.js和PyPy存在一定差距。
658

被折叠的 条评论
为什么被折叠?



