什么是 JIT?JIT(JustInTime Compilation,及时编译)是一种运行时编译技术,它在程序运行时将字节码转换为机器码,以提高代码的执行效率。PHP 8 引入了 JIT,旨在优化性能...
JIT(Just-In-Time Compilation,及时编译)是一种运行时编译技术,它在程序运行时将字节码转换为机器码,以提高代码的执行效率。
PHP 8 引入了 JIT,旨在优化性能,特别是在计算密集型任务中。对于 CPU 密集型操作(例如复杂的计算),JIT 可以提供显著的性能提升。
PHP 官方团队从 8.0 一直到 8.4 一直在优化 JIT,提升性能。目前 PHP JIT 性能已经逐渐接近了 Java 和 Node.js V8 的水平。
很多 PHPer 误以为 Swoole 不支持 JIT,其实是错误的认识。实际上只要配置得当, Swoole 下完全可以开启 JIT。
使用 JIT 前,检查 php.ini 中下列几项配置:
zend_extension=opcache.so,JIT 实现是在 opcache 扩展中,必须要开启 opcache 才能使用
opcache.enable=On 开启 JIT
opcache.enable_cli=On 在命令行模式下开启,请注意 Swoole、Workerman模式下必须要开启此选项才能使用 JIT
opcache.jit_buffer_size=128M 为编译 JIT 代码保留的共享内存量,必须是大于 0 的数值
opcache.jit=1225 设置 JIT 优化等级,参考:https://www.php.net/manual/zh/opcache.configuration.php#ini.o...
opcache.jit的值是一个字符串,或4字节数字,每个字节表示一项设置
disable:完全禁用,无法在运行时启用
off:禁用,但可以在运行时启用
tracing/on:使用追踪 JIT。默认启用并推荐给大部分用户
function:使用函数 JIT
"tracing" 模式对应 CRTO = 1254,"function" 模式对应 CRTO = 1205。
针对高级用法,此选项接受 4 位整数 CRTO,其中的位分别是:
0:禁用特定 CPU 优化
1:如果 CPU 支持则启用 AVX
0:不执行寄存器分配
1:执行局部域寄存器分配
2:执行全局寄存器分配
0: 在脚本加载时编译所有函数
1: 在第一次执行时编译函数
2:第一次请求时分析函数,然后编译最热门函数
3:动态分析和编译热门函数
4:目前未使用
5:使用追踪 JIT。动态分析和为热门代码段编译追踪
0:关闭 JIT 优化
1:最小 JIT(调用标准 VM 处理程序)
2:内联 VM 处理程序
3:使用类型推断
4:使用调用图
5:优化整个脚本
在 Swoole 协程下,第三项 T(触发) 的等级必须为大于或等于2,否则 Swoole Runtime Hook 可能不会生效。例如可设置为 opcache.jit=1225
参考:https://php.watch/articles/jit-in-depth
此测试是基于
PHP 8.0,当前的8.3版本相比又有了较大的性能提升