PHP8 alpha1已经在昨天发布,相信关于JIT是大家最关心的,它到底怎么用,有什么要注意的,以及性能提升到底咋样?
首先,我们来看一张图:
几个关键点:
PHP8的JIT是在Opcache之中提供的
目前PHP8只支持x86架构的CPU
JIT是在原来Opcache优化的优化基础之上进行优化的,不是替代
事实上JIT共用了很多原来Opcache做优化的基础数据结构,比如data flow graph, call graph, SSA等,关于这部分后续有时间单独来写,今天就只是着重介绍使用层面。
下载安装好PHP8以后,除掉原有的opcache配置以外,对于JIT我们需要添加如下配置到php.ini:
opcache.jit=1205
opcache.jit_buffer_size是定义分配多少内存给生成的机器码,这个看情况吧,一般测试就64M就行了,如果大型项目,可能要适当的大点。
opcache.jit这个配置看起来稍微有点复杂,我来解释下, 这个配置由4个独立的数字组成,从左到右分别是(请注意,这个是基于目前alpha1的版本设置,一些配置可能会随着后续版本做微调):
是否在生成机器码点时候使用AVX指令, 需要CPU支持:
0: 不使用
寄存器分配策略:
0: 不使用寄存器分配
JIT触发策略:
0: PHP脚本载入的时候就JIT
JIT优化策略,数值越大优化力度越大:
0: 不JIT
基于此,我们可以大概得到如下几个结论:
尽量使用12X5型的配置,此时应该是效果最优的
对于上面的X,如果是脚本级别的,推荐使用0, 如果是Web服务型的,可以根据测试结果选择3或5
@jit的形式,在有了attributes以后,可能变为<
>
现在,我们来测试下启用和不启用JIT的时候,Zend/bench.php的差异,首先是不启用(php -d opcache.jit_buffer_size=0 Zend/bench.php):
simple 0.008
根据上面的介绍,我们选择opcache.jit=1205, 因为bench.php是脚本(php -d opcache.jit_buffer_size=64M -d opcache.jit=1205 Zend/bench.php):
simple 0.002
可见,对于Zend/bench.php, 相比不开启JIT,开启了以后,耗时降低将近60%,性能提升将近2倍。
对于大家研究学习来说,可以通过opcache.jit_debug来观测JIT后生成的汇编结果,比如对于:
function simple() {
我们通过php -d opcache.jit=1205 -dopcache.jit_debug=0x01 可以看到:
JIT$simple: ; (/tmp/1.php)
而如果我们采用opcache.jit=1201, 我们可以得到如下结果:
JIT$simple: ; (/tmp/1.php)
你也可以尝试各种debug的配置,比如opcache.jit_debug=0xff,将会有更多的信息输出。可以试试读读,了解JIT编译过程中间的过程。
好了,JIT的使用就简单介绍到这里,关于JIT本身的实现等细节,以后有时间,我再来写吧。
(点击阅读原文,看最新更新版) 大家现在就可以去php.net下载PHP8来测试了 :)
本文分享自微信公众号 - PHP开源Hub(php_open)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。