什么是 JIT?
JIT
(Just-In-Time Compilation
,及时编译)是一种运行时编译技术,它在程序运行时将字节码转换为机器码,以提高代码的执行效率。
PHP 8
引入了 JIT
,旨在优化性能,特别是在计算密集型任务中。对于 CPU
密集型操作(例如复杂的计算),JIT
可以提供显著的性能提升。
PHP
官方团队从 8.0
一直到 8.4
一直在优化 JIT
,提升性能。目前 PHP JIT
性能已经逐渐接近了 Java
和 Node.js V8
的水平。
Swoole 对 JIT 的支持
很多 PHPer
误以为 Swoole
不支持 JIT
,其实是错误的认识。实际上只要配置得当, Swoole
下完全可以开启 JIT
。
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...
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
版本相比又有了较大的性能提升
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。