JIT的基本概念
JIT(Just-In-Time Compilation,即時編譯)runtime編譯,php的opcache.jit在程序運行時將字節碼轉換為機器碼,以提高代碼的執行效率。
jit在軟體領域裡面不是一個新名詞,例如lua腳本,jit對其性能的提升得到了充分驗證。
經過php5.6時代開始長年的性能爭論, 和zend核心開發者的大力介入, php8.0版引入了jit,同樣是為了提升計算密集型任務中的性能, 設法讓php以簡單易上手的形象, 能夠躋身cpu(中等)密集型操作、應付相對複雜的計算。
zend從8.0到現在一直在優化jit, 據說這個後起之秀已經逐漸接近了Java8和Node.js v8。
問題: swoole開jit有沒有用?
江湖訛傳swoole是常駐內存的, 沒必要開jit。實際非也、非也。
swoole+jit配置詳解
php.ini改以下的內容開jit:
zend_extension="opcache.so" opcache.enable=1 opcache.enable_cli=1 opcache.jit_buffer_size=128M
注意這一項, 在php 8.5提高這個配置的值, 可成倍提升密集運算性能。
opcache.jit=1225
設置 JIT 優化等級,1225就很好,傳送門:https://www.php.net/manual/zh/opcache.configuration.php#ini.opcache.jit-buffer-size
php.ini當中opcache.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不會生效。
嚕囌了一大堆, 你不如聽我的, 直接寫1225
opcache.jit=1225
jit測試結果
測試結果傳送門:https://php.watch/articles/jit-in-depth
“此測試是基於 PHP 8.0,當前的 8.3 版本相比又有了較大的性能提升”