node.js java 效率_简单的PHP 8 / PyPy / Node.js JIT性能对比

PHP8 JIT性能测试
本文通过Brainfuck解释器测试PHP8的JIT性能,并与其他语言进行对比。结果显示PHP8 JIT在部分基准测试中有较好的表现,但仍与Node.js和PyPy存在一定差距。

写在前面:完整的评估性能必须要靠更全面的benchmark,micro-benchmark只能说明一部分问题,一般只能提供某种场景下提升的情况。真实的提升离不开真实场景下对应用的测试。

在知乎上看到一个很有意思的PHP 8 JIT版本的benchmark

https://zhuanlan.zhihu.com/p/314783520​zhuanlan.zhihu.comzhihu-card-default.svg

这个实验通过一个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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值