來自:開源中國
摘要: PHP 是 Web 開發(fā)最常用的語言悲立,自創(chuàng)建以來鹿寨,PHP 語言經(jīng)歷了許多激烈的改進(jìn),其中性能是開發(fā)人員在評(píng)估新版本時(shí)考慮的主要標(biāo)準(zhǔn)之一薪夕。每個(gè)大版本的更新都會(huì)帶來很多新特性和性能提升脚草。
TIOBE 2017 年度編程語言榜單已出爐,世界上最好的語言 PHP 再度無緣年度編程語言原献。
距離其上次(2004 年)獲得年度編程語言馏慨,已有 13 年之久。而從歷年 TIOBE 編程排行榜趨勢圖也可以看到姑隅,自 2014 年以來写隶,PHP 總體處于持續(xù)下滑趨勢。
作為世界上最好的語言讲仰,PHP 的霸主地位會(huì)被撼動(dòng)嗎慕趴?
據(jù) W3Techs.com 的數(shù)據(jù)顯示,近年來叮盘,有超過 80% 的網(wǎng)站在服務(wù)器端的編程語言選擇了 PHP秩贰,一門語言流行的背后必會(huì)有其原因霹俺,PHP 一開始憑借其簡單上手而流行起來柔吼,而持續(xù)流行了這么多年,我們相信不僅僅是由于它的易于使用丙唧,作為一門服務(wù)器端的語言愈魏,如果性能沒有足夠好,很難一直被流行至今。
下面培漏,我們不妨回顧下 PHP 的性能是如何演進(jìn)的溪厘。
PHP 的性能演進(jìn)歷史
PHP 是 Web 開發(fā)最常用的語言,自 1994 年 Rasmus Lerdorf 創(chuàng)建 PHP 以來牌柄,PHP 語言經(jīng)歷了許多激烈的改進(jìn)畸悬,其中性能是開發(fā)人員在評(píng)估新版本時(shí)考慮的主要標(biāo)準(zhǔn)之一。每個(gè)大版本的更新都會(huì)帶來很多新特性和性能提升珊佣。
有關(guān) PHP 性能改進(jìn)的主要版本歷史:
1994:Rasmus Lerdorf 為了維護(hù)個(gè)人網(wǎng)頁而制作了一個(gè)簡單的用 Perl 語言編寫的程序蹋宦,稱為 Personal Home Page
1995:Rasmus Lerdorf 用 C 語言對"Personal Home Page"進(jìn)行重新編寫,包括可以訪問數(shù)據(jù)庫咒锻,并于 1995 年 6 月 8 日發(fā)布了首個(gè)公開版冷冗。這是 PHP 1.0 版本,也是第一次使用了"PHP"的名字
1997:Rasmus Lerdorf惑艇、Andi Gutmans 和 Zeev Suraski 加入了該語言的第三個(gè)版本的開發(fā)蒿辙,并進(jìn)行根本性的重新設(shè)計(jì),性能大大提升滨巴。從那之后思灌, PHP 開發(fā)組也創(chuàng)建并發(fā)展起來。PHP 也在這個(gè)時(shí)候改稱為 PHP:Hypertext Preprocessor
2000:以 Zend Engine 1.0 為基礎(chǔ)的 PHP 4 正式發(fā)布兢卵,自此习瑰,PHP 的性能才開始變得正式起來
2004:發(fā)布了 PHP 5,PHP 5 使用了第二代的 Zend Engine秽荤。PHP 包含了許多新特色甜奄,如強(qiáng)化的面向?qū)ο蠊δ堋⒁?PDO(PHP Data Objects窃款,一個(gè)存取數(shù)據(jù)庫的延伸函數(shù)庫)课兄、以及許多效能上的增強(qiáng)
2015:12 月 3 日,PHP 7.0 正式發(fā)布晨继,使用的 Zend Engine 3 帶來了 100% 的性能提升烟阐,還有統(tǒng)一的變量語法,基于抽象語法樹編譯過程
可以看到紊扬,于 2015 年發(fā)布的 PHP 7 在性能方面取得了重大的突破蜒茄。該版本最大的改進(jìn)莫過于無感知的 100% 性能提升,其中包含了運(yùn)行速度與內(nèi)存消耗餐屎。與 PHP 5 相比檀葛,PHP 7 的綜合性能提升了一倍以上。
PHP 7 帶來的性能飛躍讓開發(fā)者獲益良多腹缩,使得很多應(yīng)用受益屿聋,也使得 PHP 的應(yīng)用場景變得更加廣泛空扎。
那么下一步 PHP 的性能提升方向是什么?下文將分享 PHP 下一個(gè)性能提升的主要舉措:JIT 的進(jìn)展润讥,以及下一個(gè)大版本的 PHP 可能帶來的特性转锈。( 整理出自:2017 年 OSC 源創(chuàng)會(huì)年終盛典鳥哥演講《PHP Next: JIT》)
鳥哥表示,從 PHP 7 發(fā)布到現(xiàn)在楚殿,在提交一些關(guān)于性能提升的工作時(shí)撮慨,阻力會(huì)變得小很多〈嘀啵可以說甫煞,PHP 7 是開啟了 PHP 性能發(fā)展方向的一個(gè)風(fēng)潮。
事實(shí)上冠绢,為一個(gè)有長遠(yuǎn)歷史的程序做優(yōu)化的難度比推倒重構(gòu)更高抚吠。PHP 7 在性能方面帶來了跨越式的提升,如果能夠?qū)⑦@些成果應(yīng)用到使用 PHP 的 Web 系統(tǒng)中弟胀,也許只需要更少的機(jī)器楷力,就能支撐起更高請求量的服務(wù)。
PHP 7 之后會(huì)有什么 —— JIT
這是一個(gè)十分值得我們期待的版本孵户,目前由 Zend 引擎的 Dmitry Stogov 主導(dǎo)萧朝。雖然它是基于 PHP 7.1 版本,但實(shí)際版本號(hào)尚未確定夏哭。
JIT 是什么检柬?為什么是 JIT?
JIT (Just-In- Time 即時(shí)編譯) 并非是新技術(shù)竖配,很多語言例如 Java 早已實(shí)現(xiàn)何址。JIT 的思想很簡單,即在程序運(yùn)行時(shí)動(dòng)態(tài)對程序進(jìn)行編譯进胯,生成平臺(tái)相關(guān)的機(jī)器碼(比如運(yùn)行它的機(jī)器 CPU 的本地代碼)用爪,從而加快程序的運(yùn)行速度。
為什么是 JIT胁镐?
不妨先來看看 PHP 文件的執(zhí)行流程偎血。PHP 文件的執(zhí)行流程大致是首先引擎加載 PHP 文件,解釋器逐條解釋執(zhí)行代碼盯漂。
引入 JIT 后颇玷,前面部分一樣,重點(diǎn)是 JIT 編譯器會(huì)根據(jù) Runtime 信息對熱點(diǎn)代碼進(jìn)行動(dòng)態(tài)編譯生成機(jī)器碼就缆,此后這部分代碼就可以直接執(zhí)行帖渠,不再需要解釋器逐條解釋執(zhí)行,因此運(yùn)行效率會(huì)得到提升违崇。
Facebook 開源的 PHP 虛擬機(jī) HHVM(HipHop Virtual Machine) 就采用了 JIT阿弃,這讓他們的 PHP 性能測試結(jié)果提升了一個(gè)數(shù)量級(jí),也讓開發(fā)者意識(shí)到 JIT 是一項(xiàng)點(diǎn)石成金的強(qiáng)大技術(shù)羞延。HHVM 也是目前最熱門的帶 JIT 編譯器的 PHP 實(shí)現(xiàn)渣淳。
PHP 7.1 引入了類型推斷
而 PHP 要想實(shí)現(xiàn) JIT,必須要解決變量的類型推斷這個(gè)難題伴箩。試想入愧,如果在動(dòng)態(tài)編譯時(shí)仍需要進(jìn)行大量的類型檢查,性能將會(huì)大幅下降嗤谚。
PHP 7.1 引入了一個(gè)稱作“類型推斷”的特性棺蛛,這是現(xiàn)階段正在實(shí)現(xiàn)的 JIT 的前驅(qū),但它不是單獨(dú)開發(fā)的巩步,2013 年的 PHP 5 已經(jīng)實(shí)現(xiàn)了一套推斷系統(tǒng)旁赊,7.1 嵌入了這套系統(tǒng)并對其進(jìn)行優(yōu)化。
PHP 7 中已經(jīng)可以控制變量的類型椅野,7.1 對這個(gè)機(jī)制進(jìn)行了完善终畅。我們甚至可以說目前的 PHP 已經(jīng)是半強(qiáng)類型語言,但由于 PHP 的弱類型語言歷史竟闪,目前仍有大量代碼在運(yùn)行前無法得知變量類型离福,所以在 7.1 中 PHP 的開發(fā)者進(jìn)行了大量變量類型推斷的工作,為后續(xù)的 JIT 實(shí)現(xiàn)打下基礎(chǔ)炼蛤。
對變量進(jìn)行推斷妖爷,目前比較簡單的一種辦法是數(shù)據(jù)流分析,即分析代碼的上下文理朋,從而推斷出變量的可能類型絮识,比如:
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;
}
對于這項(xiàng)改進(jìn),目前依然有較多的困難嗽上,鳥哥表示他們的解決思路是對 JIT 進(jìn)行分級(jí)笋除,通過配置實(shí)現(xiàn)不同程度的動(dòng)態(tài)編譯,從而降低類型預(yù)測的難度炸裆。此外垃它,針對具體的場景,進(jìn)行垂直優(yōu)化烹看。除了基于數(shù)據(jù)流的分析国拇,PHP 7.1 還會(huì)基于分支進(jìn)行判斷。
PHP 7.2 繼續(xù)提升性能并完善類型推斷
PHP 7.2 不久前也已發(fā)布惯殊,與 7.1 相比酱吝,它的性能有大約 10% 的提升。7.2 在數(shù)據(jù)流分析里引入了三個(gè)新特性土思。
sparse conditional constant propagation
逃逸分析
移除“死代碼”(消除沒有副作用的代碼)
PHP 7.2 還包括對基于分支預(yù)測的優(yōu)化务热,此外忆嗜,還引入了稱為"HYBRID VM"的虛擬機(jī)引擎。
關(guān)于 JIT 性能表現(xiàn)的一些數(shù)據(jù)
那么崎岂,JIT 性能的提升效果表現(xiàn)如何捆毫?這要取決于項(xiàng)目的實(shí)際瓶頸。鳥哥表示冲甘,JIT 對性能提升要看具體的情景绩卤,如果某段邏輯是計(jì)算密集型的,它的提升大概有 1/4江醇,不過也有一些性能提升不明顯的場景濒憋,如果在 IO 密集型場景下進(jìn)行測試,性能的提升不會(huì)很明顯陶夜,所以一定要考慮具體的使用場景凛驮。
此外,鳥哥表示条辟,將來如果要寫出更友好的代碼辐烂,不妨考慮多添加一些類型提示。
最后
TIOBE 編程語言社區(qū)排行榜是編程語言流行趨勢的一個(gè)指標(biāo)捂贿,名次的下降一定程度反映了當(dāng)前編程語言的流行趨勢纠修,但不能成為衡量一門語言是否優(yōu)秀的唯一標(biāo)準(zhǔn)。有些編程語言受眾領(lǐng)域較小厂僧,難以達(dá)到大范圍的推廣普及扣草,但在它所專長的領(lǐng)域,發(fā)揮著獨(dú)有的優(yōu)勢颜屠。
PHP 在服務(wù)端編程語言領(lǐng)域依舊占據(jù)主導(dǎo)地位辰妙,同時(shí),PHP 社區(qū)組持續(xù)不斷地做版本迭代更新甫窟,性能提升密浑。下一個(gè)大版本將引入 JIT 特性,這個(gè)被奉為點(diǎn)石成金的技術(shù)會(huì)給 PHP 帶來更好的性能粗井,更大的發(fā)展嗎尔破?
參考: