php8的新特性(二) JIT


JIT

原理

jit编译原理图

Zend Opcache流程

  1. 检查opcodes是否缓存
  2. zend compiler编译器进行编译生成opcodes
  3. optimizer优化器生成优化后的opcodes
  4. 把优化后的opcodes放入opcodes cache缓存
  5. 经过zend vm虚拟机生成opcodes handlers处理程序
  6. 送入x86 cpu架构进行执行

JIT编译流程

  1. 检查opcodes是否缓存
  2. zend compiler编译器进行编译生成opcodes
  3. optimizer优化器生成优化后的opcodes
  4. 把优化后的opcodes放入opcodes cache缓存
  5. jit编译器把optimized opcodes再次编译成汇编机器码machine codes
  6. 进入zend vm虚拟前先检查是否开启jit引擎
  7. 如果已经开启了jit引擎则直接读取机器码中的jit buffer代码片段
  8. 送入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每一位都是一个设置,从左至右开始依次介绍

  1. 是否在生成机器码的时候使用AVX指令, 需要CPU支持

    0.不使用、1.使用

  2. 寄存器分配策略

    0.不使用寄存器分配

    1.局部(block)域分配

    2.全局(function)域分配

  3. 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

  4. JIT优化策略,数值越大优化力度越大

    0: 不JIT

    1: 做opline之间的跳转部分的JIT

    2: 内敛opcode handler调用

    3: 基于类型推断做函数级别的JIT

    4: 基于类型推断,过程调用图做函数级别JIT

    5: 基于类型推断,过程调用图做脚本级别的JIT


文章作者: 我若为侠
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 我若为侠 !
 上一篇
Nginx日志统计分析常用命令 Nginx日志统计分析常用命令
1.Nginx访问日志中 按照ip请求次数统计命令(必备)cat access.log |awk '{print $1}'|sort -nr |uniq -c |sort -nr |more 2761 183.185.117.4
下一篇 
php8的新特性(一) 主要新特性 php8的新特性(一) 主要新特性
php8的主要新特性命名参数定义声明$中的参数名称不带符号将是参数名称,或函数形参的名字取$后变为实参的命名函数 格式:name:"nickname" 或 name:$name 示例function info($nickname, $a
  目录