JIT
在PHP 8 中,Opcache扩展集成了JIT(Just In Time)编译器,这个编译器的特性是在运行时将某些操作码直接转换为从cpu的指令。再说的简单一些就是在使用JIT后,ZendVM不需要解释某些操作码了,这些指令将直接作为CPU级指令执行。
执行流程
为了让大家更直观的了解这个特性,我们来看下在不同情况下php是如何进行执行的:
我们与机器沟通的顺序
源代码(人认识)->字节码(解释器认识)->机器码(硬件认识)
不启用opacache的执行流程
hunter.php->zend编译->opcode->PHP解释器->机器码
启用opacache的执行流程
hunter.php->查找opacache缓存(没有)->zend编译->opacode(添加缓存)->PHP解释器->机器码
hunter.php->查找opacache缓存(有缓存)->PHP解释器->机器码
启用opacache内jit的执行流程
hunter.php->编译->机器码
通过以上执行流程的介绍,我们其实可以非常直观的看出执行流程的缩减带来的大幅度效率的提升。默认情况下和php7.4性能基本接近,但是开启jit后在cpu密集计算的情况下可以提升92%左右的性能,比php5性能提升5-7倍。
配置说明
在安装完opcache拓展后,需要在php.ini
文件内加入以下配置,如果是使用宝塔进行安装扩展后,以下就是默认的配置内容
opcache.jit=1205
opcache.jit_buffer_size=128M
1025含义
这个配置由4个独立的数字组成,分别代表是否使用AVX指令、寄存器分配策略、JIT触发策略、JIT优化策略
- 是否在生成机器码点时候使用AVX指令,需要CPU支持:
0:不使用
1:使用
- 寄存器分配策略:
0:不使用寄存器分配
1:局部(block)域分配
2:全局(function)域分配
- JIT触发策略:
0:PHP脚本载入的时候就JIT
1:当函数第一次被执行时JIT
2:在一次运行后,JIT调用次数最多的百分之(opcache.prof\_threshold\*100)的函数
3:当函数/方法执行超过N(N和opcache.jit\_hot\_func相关)次以后JIT
4:当函数方法的注释中含有 jit的时候对它进行JIT
5:当一个Trace执行超过N次(和opcache.jit\_hot\_loop,jit\_hot\_return等有关)以后JIT
- JIT优化策略,数值越大优化力度越大:
0:不JIT
1:做opline之间的跳转部分的JIT
2:内敛opcode handler调用
3:基于类型推断做函数级别的JIT
4:基于类型推断,过程调用图做函数级别JIT
5:基于类型推断,过程调用图做脚本级别的JIT
推荐使用的配置是12X5,其中第三位X是脚本级别的,推荐使用0,如果是Web服务型的,可以根据测试结果选择3或5。
2 条评论
不错,路过,支持一下,留个脚印!
PHP8的兼容性是个大坑呀!
欢迎大佬