當前位置:
首頁 > 知識 > PHP 霸主地位被動搖,JIT 是窮途末路後的絕地反擊?

PHP 霸主地位被動搖,JIT 是窮途末路後的絕地反擊?

摘要: PHP 是 Web 開發最常用的語言,自創建以來,PHP 語言經歷了許多激烈的改進,其中性能是開發人員在評估新版本時考慮的主要標準之一。每個大版本的更新都會帶來很多新特性和性能提升。

TIOBE 2017 年度編程語言榜單已出爐,世界上最好的語言 PHP 再度無緣年度編程語言。

距離其上次(2004 年)獲得年度編程語言,已有 13 年之久。而從歷年 TIOBE 編程排行榜趨勢圖也可以看到,自 2014 年以來,PHP 總體處於持續下滑趨勢。

PHP 霸主地位被動搖,JIT 是窮途末路後的絕地反擊?

作為世界上最好的語言,PHP 的霸主地位會被撼動嗎?

據 W3Techs.com 的數據顯示,近年來,有超過 80% 的網站在伺服器端的編程語言選擇了 PHP,一門語言流行的背後必會有其原因,PHP 一開始憑藉其簡單上手而流行起來,而持續流行了這麼多年,我們相信不僅僅是由於它的易於使用,作為一門伺服器端的語言,如果性能沒有足夠好,很難一直被流行至今。

PHP 霸主地位被動搖,JIT 是窮途末路後的絕地反擊?

下面,我們不妨回顧下 PHP 的性能是如何演進的。

PHP的性能演進歷史

PHP 是 Web 開發最常用的語言,自 1994 年 Rasmus Lerdorf 創建 PHP 以來,PHP 語言經歷了許多激烈的改進,其中性能是開發人員在評估新版本時考慮的主要標準之一。每個大版本的更新都會帶來很多新特性和性能提升。

有關 PHP 性能改進的主要版本歷史:

  • 1994:Rasmus Lerdorf 為了維護個人網頁而製作了一個簡單的用 Perl 語言編寫的程序,稱為 Personal Home Page

  • 1995:Rasmus Lerdorf 用 C 語言對"Personal Home Page"進行重新編寫,包括可以訪問資料庫,並於 1995 年 6 月 8 日發布了首個公開版。這是 PHP 1.0 版本,也是第一次使用了"PHP"的名字

  • 1997:Rasmus Lerdorf、Andi Gutmans 和 Zeev Suraski 加入了該語言的第三個版本的開發,並進行根本性的重新設計,性能大大提升。從那之後, PHP 開發組也創建並發展起來。PHP 也在這個時候改稱為 PHP:Hypertext Preprocessor

  • 2000:以 Zend Engine 1.0 為基礎的 PHP 4 正式發布,自此,PHP 的性能才開始變得正式起來

  • 2004:發布了 PHP 5,PHP 5 使用了第二代的 Zend Engine。PHP 包含了許多新特色,如強化的面向對象功能、引入 PDO(PHP Data Objects,一個存取資料庫的延伸函數庫)、以及許多效能上的增強

  • 2015:12 月 3 日,PHP 7.0 正式發布,使用的 Zend Engine 3 帶來了 100% 的性能提升,還有統一的變數語法,基於抽象語法樹編譯過程

可以看到,於 2015 年發布的 PHP 7 在性能方面取得了重大的突破。該版本最大的改進莫過於無感知的 100% 性能提升,其中包含了運行速度與內存消耗。與 PHP 5 相比,PHP 7 的綜合性能提升了一倍以上。

PHP 霸主地位被動搖,JIT 是窮途末路後的絕地反擊?

PHP 7 帶來的性能飛躍讓開發者獲益良多,使得很多應用受益,也使得 PHP 的應用場景變得更加廣泛。

那麼下一步 PHP 的性能提升方向是什麼?下文將分享 PHP 下一個性能提升的主要舉措:JIT 的進展,以及下一個大版本的 PHP 可能帶來的特性。( 整理出自:2017 年 OSC 源創會年終盛典鳥哥演講《PHP Next: JIT》)

鳥哥表示,從 PHP 7 發布到現在,在提交一些關於性能提升的工作時,阻力會變得小很多。可以說,PHP 7 是開啟了 PHP 性能發展方向的一個風潮。

事實上,為一個有長遠歷史的程序做優化的難度比推倒重構更高。PHP 7 在性能方面帶來了跨越式的提升,如果能夠將這些成果應用到使用 PHP 的 Web 系統中,也許只需要更少的機器,就能支撐起更高請求量的服務。

PHP 7之後會有什麼 —— JIT

這是一個十分值得我們期待的版本,目前由 Zend 引擎的 Dmitry Stogov 主導。雖然它是基於 PHP 7.1 版本,但實際版本號尚未確定。

JIT是什麼?為什麼是 JIT?

JIT (Just-In- Time 即時編譯) 並非是新技術,很多語言例如 Java 早已實現。JIT 的思想很簡單,即在程序運行時動態對程序進行編譯,生成平台相關的機器碼(比如運行它的機器 CPU 的本地代碼),從而加快程序的運行速度。

為什麼是 JIT?

不妨先來看看 PHP 文件的執行流程。PHP 文件的執行流程大致是首先引擎載入 PHP 文件,解釋器逐條解釋執行代碼。

PHP 霸主地位被動搖,JIT 是窮途末路後的絕地反擊?

引入 JIT 後,前面部分一樣,重點是 JIT 編譯器會根據 Runtime 信息對熱點代碼進行動態編譯生成機器碼,此後這部分代碼就可以直接執行,不再需要解釋器逐條解釋執行,因此運行效率會得到提升。

Facebook 開源的 PHP 虛擬機 HHVM(HipHop Virtual Machine) 就採用了 JIT,這讓他們的 PHP 性能測試結果提升了一個數量級,也讓開發者意識到 JIT 是一項點石成金的強大技術。HHVM 也是目前最熱門的帶 JIT 編譯器的 PHP 實現。

PHP 7.1引入了類型推斷

而 PHP 要想實現 JIT,必須要解決變數的類型推斷這個難題。試想,如果在動態編譯時仍需要進行大量的類型檢查,性能將會大幅下降。

PHP 7.1 引入了一個稱作「類型推斷」的特性,這是現階段正在實現的 JIT 的前驅,但它不是單獨開發的,2013 年的 PHP 5 已經實現了一套推斷系統,7.1 嵌入了這套系統並對其進行優化。

PHP 7 中已經可以控制變數的類型,7.1 對這個機制進行了完善。我們甚至可以說目前的 PHP 已經是半強類型語言,但由於 PHP 的弱類型語言歷史,目前仍有大量代碼在運行前無法得知變數類型,所以在 7.1 中 PHP 的開發者進行了大量變數類型推斷的工作,為後續的 JIT 實現打下基礎。

對變數進行推斷,目前比較簡單的一種辦法是數據流分析,即分析代碼的上下文,從而推斷出變數的可能類型,比如:

function calc ($a1, $b2) { // $a1: [ANY], $b2: [ANY]
$T3 = $a1 * 2; // $T3: [LONG, DOUBLE]
$a4 = $T3 % 1000; // $a4: [LONG]
$T5 = $b2 * 3; // $T5: [LONG, DOUBLE]
$b6 = $T5 % 1000; // $b6: [LONG]
$T7 = $a4 + $b6; // $T7: [LONG, DOUBLE]
return $T7;
}

對於這項改進,目前依然有較多的困難,鳥哥表示他們的解決思路是對 JIT 進行分級,通過配置實現不同程度的動態編譯,從而降低類型預測的難度。此外,針對具體的場景,進行垂直優化。除了基於數據流的分析,PHP 7.1 還會基於分支進行判斷。

PHP 7.2繼續提升性能並完善類型推斷

PHP 7.2 不久前也已發布,與 7.1 相比,它的性能有大約 10% 的提升。7.2 在數據流分析里引入了三個新特性。

  • sparse conditional constant propagation

  • 逃逸分析

  • 移除「死代碼」(消除沒有副作用的代碼)

PHP 7.2 還包括對基於分支預測的優化,此外,還引入了稱為"HYBRID VM"的虛擬機引擎。

PHP 霸主地位被動搖,JIT 是窮途末路後的絕地反擊?

關於 JIT 性能表現的一些數據

PHP 霸主地位被動搖,JIT 是窮途末路後的絕地反擊?

PHP 霸主地位被動搖,JIT 是窮途末路後的絕地反擊?

PHP 霸主地位被動搖,JIT 是窮途末路後的絕地反擊?

那麼,JIT 性能的提升效果表現如何?這要取決於項目的實際瓶頸。鳥哥表示,JIT 對性能提升要看具體的情景,如果某段邏輯是計算密集型的,它的提升大概有 1/4,不過也有一些性能提升不明顯的場景,如果在 IO 密集型場景下進行測試,性能的提升不會很明顯,所以一定要考慮具體的使用場景。

此外,鳥哥表示,將來如果要寫出更友好的代碼,不妨考慮多添加一些類型提示。

最後

TIOBE 編程語言社區排行榜是編程語言流行趨勢的一個指標,名次的下降一定程度反映了當前編程語言的流行趨勢,但不能成為衡量一門語言是否優秀的唯一標準。有些編程語言受眾領域較小,難以達到大範圍的推廣普及,但在它所專長的領域,發揮著獨有的優勢。

PHP 在服務端編程語言領域依舊佔據主導地位,同時,PHP 社區組持續不斷地做版本迭代更新,性能提升。下一個大版本將引入 JIT 特性,這個被奉為點石成金的技術會給 PHP 帶來更好的性能,更大的發展嗎?

參考:

http://hansionxu.blog.163.com/blog/static/24169810920158704014772/

http://www.laruence.com/2016/12/18/3137.html

https://www.jianshu.com/p/de1b5c6849c8

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 OSC開源社區 的精彩文章:

TAG:OSC開源社區 |