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->编译->机器码

JIT对比

通过以上执行流程的介绍,我们其实可以非常直观的看出执行流程的缩减带来的大幅度效率的提升。默认情况下和php7.4性能基本接近,但是开启jit后在cpu密集计算的情况下可以提升92%左右的性能,比php5性能提升5-7倍。

配置说明

在安装完opcache拓展后,需要在php.ini文件内加入以下配置,如果是使用宝塔进行安装扩展后,以下就是默认的配置内容

opcache.jit=1205
opcache.jit_buffer_size=128M

1025含义

这个配置由4个独立的数字组成,分别代表是否使用AVX指令、寄存器分配策略、JIT触发策略、JIT优化策略

  1. 是否在生成机器码点时候使用AVX指令,需要CPU支持:
0:不使用
1:使用
  1. 寄存器分配策略:
0:不使用寄存器分配
1:局部(block)域分配
2:全局(function)域分配
  1. 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
  1. JIT优化策略,数值越大优化力度越大:
0:不JIT
1:做opline之间的跳转部分的JIT
2:内敛opcode handler调用
3:基于类型推断做函数级别的JIT
4:基于类型推断,过程调用图做函数级别JIT
5:基于类型推断,过程调用图做脚本级别的JIT

推荐使用的配置是12X5,其中第三位X是脚本级别的,推荐使用0,如果是Web服务型的,可以根据测试结果选择3或5。

正文到此结束

本文标题:PHP8中的JIT(Just In Time)

本文链接:https://www.hantaosec.com/3615.html

除非另有说明,本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

声明:转载请注明文章来源及链接,不带链接禁止任何转载!访问任何网络安全相关文章,则视为默认接受网络安全文章免责声明 ,请认真阅读。

喜欢我的文章吗?
别忘了点赞或赞赏,让我知道创作的路上有你陪伴。