写在前面:完整的评估性能必须要靠更全面的benchmark,micro-benchmark只能说明一部分问题,一般只能提供某种场景下提升的情况。真实的提升离不开真实场景下对应用的测试。
在知乎上看到一个很有意思的PHP 8 JIT版本的benchmark
https://zhuanlan.zhihu.com/p/314783520 zhuanlan.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上
来源:oschina
链接:https://my.oschina.net/u/4272135/blog/4759087