JIT
原理
Zend Opcache流程
- 检查opcodes是否缓存
- zend compiler编译器进行编译生成opcodes
- optimizer优化器生成优化后的opcodes
- 把优化后的opcodes放入opcodes cache缓存
- 经过zend vm虚拟机生成opcodes handlers处理程序
- 送入x86 cpu架构进行执行
JIT编译流程
- 检查opcodes是否缓存
- zend compiler编译器进行编译生成opcodes
- optimizer优化器生成优化后的opcodes
- 把优化后的opcodes放入opcodes cache缓存
- jit编译器把optimized opcodes再次编译成汇编机器码machine codes
- 进入zend vm虚拟前先检查是否开启jit引擎
- 如果已经开启了jit引擎则直接读取机器码中的jit buffer代码片段
- 送入x86 cpu架构进行执行
总结
JIT
是基于 Opcache
之上的增强,是在 Opcache
优化后的基础上,结合 Runtime
的信息再次优化,直接生成机器码
如何使用
开启功能
#php.ini
opcache.jit=1205
opcache.jit_buffer_size=64M
opcache.jit参数说明
简单标记
1.disable
在启动时完全禁用JIT功能,并且在运行时无法启用
2.off
禁用,但是可以在运行时启用JIT
3.on
启用tracing模式
4.tracing
数值配置的别名1254
5.function
数值配置的别名1205
数值
1205每一位都是一个设置,从左至右开始依次介绍
是否在生成机器码的时候使用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