官方確認PHP 8將支持JIT即時編譯執行特性
一直以來,大家都在討論PHP 8 中是否會支持JIT(Just-In-Time)即時編譯執行功能,最新消息是官方已經確認將其引入。PHP 實現了一個虛擬機Zend VM,它會將人類可讀腳本編譯成虛擬機理解的指令,也就是操作碼,這個執行階段就是“編譯時(Compile Time)”。在“運行時(Runtime)”執行階段,虛擬機 Zend VM 會執行這些編譯好的操作碼。
通常編譯時與運行時兩個階段是獨立分開的,腳本編譯完成後,像APC 與OPCache 這樣的字節碼緩存組件會緩存這些操作碼。而JIT 去掉了編譯時階段,它將這編譯時與運行時兩個階段合為一體,實現即時編譯與執行。
JIT 是一種編譯器策略,它將代碼表述為一種中間狀態,在運行時將其轉換為依賴於體系結構的機器碼,並即時執行。在PHP 中,這意味著JIT 將為Zend VM 生成的指令視為中間表述,並以依賴於體系結構的機器碼執行,也就是說託管代碼的不再是Zend VM,而是更為底層的CPU 。
雖然自PHP 7.0 以來,通過優化核心數據結構HashTable、強化Zend VM 中某些操作碼與持續改進OPCache 的Optimizer 組件等具體措施,PHP 性能得到了顯著提升,但是實際上這些優化似乎已經走到極限了。現在JIT 從底層著手,被認為是目前提升PHP 性能的最佳出路。
關於是否引入JIT的官方投票結果已於近日公佈,因為大部分核心開發者投了贊成票,所以PHP 8中將會支持JIT。
另外值得一提的是,PHP JIT 對於使用PHP 的網站來說提速可能並不明顯,因為JIT 在CPU 密集型的代碼上效果最好,而一般情況下,用PHP 編寫的程序都是I/O密集型的。簡單來說就是,PHP 程序往往受限於I/O 而不是CPU,使PHP 代碼運行速度變慢的因素往往是它們正在執行的I/O 操作,包括連接、讀取和寫入數據庫、高速緩存、文件與套接字等。
PHP中CPU密集型代碼的一個例子是 Zend/bench.php。
那麼PHP 中的JIT 將會在哪裡發揮作用呢?答案是數學領域。關於PHP JIT 的詳細介紹,可以查看:https://blog.krakjoe.ninja/2019/03/php-gr8.html