简单的PHP 8 / PyPy / Node.js JIT性能对比

核能气质少年 提交于 2020-11-29 15:39:18

写在前面:完整的评估性能必须要靠更全面的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

可以得到以下结论:

  1. PHP 8的JIT在micro benchmark下还可以,但是跟nodejs和PyPy尚有60%的差距,推测是对于单变量++/--的优化力度还可以,但是对访问数组的优化力度不足,实际应用中可能会有更大差距
  2. PHP 8不开启JIT和PHP7差不多,这是开启OpCache的情况下测试的。不开的情况下PHP 8要比PHP 7快一些。
  3. 对于弱类型/动态类型语言来说,业界最强JIT node.js还是被编译语言吊起来打(当然,也是仅限micro benchmark),所以不要觉得有JIT了就能比肩C++/golang/Java了。
  4. CPython在这种micro benchmark下是真的拉跨到无以复加,跟PyPy有整整18倍的差距。

注意:Python有两个版本的脚本,差别很小,因为Python没有常量定义语法,所以第一个版本是用类属性代替常量的,第二个版本手动替换成了立即数,第一个版本更接近其它语言的写法,第二个版本更接近其它解释器解释的版本。

使用代码在github上

hubo1016/PHP8-Benchmark-the-Brainfuck-Way

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!