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
版本相比又有了较大的性能提升
58 天前