4

什么是 JIT?

JITJust-In-Time Compilation,及时编译)是一种运行时编译技术,它在程序运行时将字节码转换为机器码,以提高代码的执行效率。

PHP 8 引入了 JIT,旨在优化性能,特别是在计算密集型任务中。对于 CPU 密集型操作(例如复杂的计算),JIT 可以提供显著的性能提升。

PHP 官方团队从 8.0 一直到 8.4 一直在优化 JIT,提升性能。目前 PHP JIT 性能已经逐渐接近了 JavaNode.js V8 的水平。

Swoole 对 JIT 的支持

很多 PHPer 误以为 Swoole 不支持 JIT,其实是错误的认识。实际上只要配置得当, Swoole 下完全可以开启 JIT

JIT 配置详解

使用 JIT 前,检查 php.ini 中下列几项配置:

  • zend_extension=opcache.soJIT 实现是在 opcache 扩展中,必须要开启 opcache 才能使用
  • opcache.enable=On 开启 JIT
  • opcache.enable_cli=On 在命令行模式下开启,请注意 SwooleWorkerman模式下必须要开启此选项才能使用 JIT
  • opcache.jit_buffer_size=128M 为编译 JIT 代码保留的共享内存量,必须是大于 0 的数值
  • opcache.jit=1225 设置 JIT 优化等级,参考:https://www.php.net/manual/zh/opcache.configuration.php#ini.o...

JIT 优化设置

opcache.jit的值是一个字符串,或4字节数字,每个字节表示一项设置

字符串值

  • disable:完全禁用,无法在运行时启用
  • off:禁用,但可以在运行时启用
  • tracing/on:使用追踪 JIT。默认启用并推荐给大部分用户
  • function:使用函数 JIT

"tracing" 模式对应 CRTO = 1254,"function" 模式对应 CRTO = 1205

数字

针对高级用法,此选项接受 4 位整数 CRTO,其中的位分别是:

C(特定 CPU 优化 flag)

  • 0:禁用特定 CPU 优化
  • 1:如果 CPU 支持则启用 AVX

R(寄存器分配)

  • 0:不执行寄存器分配
  • 1:执行局部域寄存器分配
  • 2:执行全局寄存器分配

T(触发)

  • 0: 在脚本加载时编译所有函数
  • 1: 在第一次执行时编译函数
  • 2:第一次请求时分析函数,然后编译最热门函数
  • 3:动态分析和编译热门函数
  • 4:目前未使用
  • 5:使用追踪 JIT。动态分析和为热门代码段编译追踪

O(优化级别)

  • 0:关闭 JIT 优化
  • 1:最小 JIT(调用标准 VM 处理程序)
  • 2:内联 VM 处理程序
  • 3:使用类型推断
  • 4:使用调用图
  • 5:优化整个脚本

Swoole 协程下,第三项 T(触发) 的等级必须为大于或等于2,否则 Swoole Runtime Hook 可能不会生效。例如可设置为 opcache.jit=1225

JIT 性能测试

参考:https://php.watch/articles/jit-in-depth

此测试是基于 PHP 8.0,当前的 8.3 版本相比又有了较大的性能提升

韩天峰
7.9k 声望11.1k 粉丝

Swoole 开源项目创始人