PHP 7.2 JIT的到來,可以讓開發人員對php性能的優化更上一層樓。以往,PHP的運行速度總是被人詬病,使用緩存、減少I/O操作等優化手段,也只能提高有限的性能。而通過啟用JIT,可以使PHP的性能提高10%-20%,這樣,在某些場景下,就可以單純依靠純PHP來完成任務,而無需考慮使用其他語言。
在PHP 7.2 JIT中,使用了一種稱為Tracing JIT的技術。簡單來說,就是在程序執行期間進行trace(跟蹤),根據trace數據生成執行的機器碼,這樣就可以直接運行,無需再解釋執行PHP代碼。這種機制非常類似于JIT編譯器,因此PHP 7.2 JIT也稱為“JIT”。
這里,簡單介紹下什么是JIT:JIT是Just-In-Time的縮寫,意為即時編譯器。JIT的特點是在執行時才編譯,而不像靜態編譯器一樣提前編譯好了,然后執行。因為JIT在運行時進行編譯,所以可以根據程序運行情況實時優化,這就是JIT的優勢所在。
舉個例子,我們實現一個簡單的斐波那契數列。普通版本的PHP代碼如下:
function fibonacci($n) { if ($n == 0) { return 0; } elseif ($n == 1) { return 1; } else { return fibonacci($n - 1) + fibonacci($n - 2); } } for ($i = 0; $i< 10; $i++) { $start = microtime(true); echo fibonacci($i) . " : " . (microtime(true) - $start) . "ms"; echo "\n"; }
輸出結果如下:
0 : 0.00019407272338867ms 1 : 0.00017285346984863ms 1 : 0.001798152923584ms 2 : 0.0018711090087891ms 3 : 0.0030269622802734ms 5 : 0.0045108795166016ms 8 : 0.0086050033569336ms 13 : 0.013432025909424ms 21 : 0.021448850631714ms 34 : 0.035088062286377ms
可以看到,對于較大的數列,耗時比較長。現在,我們使用PHP 7.2 JIT,再看一下執行時間:
function fibonacci($n) { if ($n == 0) { return 0; } elseif ($n == 1) { return 1; } else { return fibonacci($n - 1) + fibonacci($n - 2); } } for ($i = 0; $i< 10; $i++) { $start = microtime(true); echo fibonacci($i) . " : " . (microtime(true) - $start) . "ms"; echo "\n"; }
輸出結果如下:
0 : 0.0001370906829834ms 1 : 0.00012397766113281ms 1 : 0.00032186508178711ms 2 : 0.00028204917907715ms 3 : 0.00061511993408203ms 5 : 0.00059986114501953ms 8 : 0.00068807601928711ms 13 : 0.0013589859008789ms 21 : 0.0018861293792725ms 34 : 0.0039298534393311ms
可以看到,通過JIT,耗時明顯降低了很多。
在PHP 7.2中,啟用JIT很簡單。你只需在php.ini中加上下面這行代碼就可以:
opcache.enable_file_override=1 opcache.jit_buffer_size=100M opcache.jit=1205
其中,opcache.enable_file_override=1表示啟用JIT;opcache.jit_buffer_size=100M表示設置JIT緩存大小為100M;opcache.jit=1205表示開啟JIT,并設置優化級別。這里,優化級別取值范圍為0-3,0表示關閉JIT,1表示啟用JIT,2-3表示使用更高級的優化級別。
總之,PHP 7.2 JIT給我們帶來了很多便利。今天,讓我們用JIT來提升我們的php代碼的性能,更好地為用戶提供服務吧!