PHP 霸主地位被動(dòng)搖彪蓬,JIT 是窮途末路后的絕地反擊?

來自:開源中國

鏈接:https://my.oschina.net/editorial-story/blog/1604717

摘要: 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ù)下滑趨勢。

image

作為世界上最好的語言讲仰,PHP 的霸主地位會(huì)被撼動(dòng)嗎慕趴?

據(jù) W3Techs.com 的數(shù)據(jù)顯示,近年來叮盘,有超過 80% 的網(wǎng)站在服務(wù)器端的編程語言選擇了 PHP秩贰,一門語言流行的背后必會(huì)有其原因霹俺,PHP 一開始憑借其簡單上手而流行起來柔吼,而持續(xù)流行了這么多年,我們相信不僅僅是由于它的易于使用丙唧,作為一門服務(wù)器端的語言愈魏,如果性能沒有足夠好,很難一直被流行至今。

image

下面培漏,我們不妨回顧下 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 的綜合性能提升了一倍以上。

image

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í)行代碼盯漂。

image

引入 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ī)引擎。

image.png

關(guān)于 JIT 性能表現(xiàn)的一些數(shù)據(jù)

image.png
image.png
image.png

那么崎岂,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ā)展嗎尔破?

參考:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市浇衬,隨后出現(xiàn)的幾起案子懒构,更是在濱河造成了極大的恐慌,老刑警劉巖耘擂,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胆剧,死亡現(xiàn)場離奇詭異,居然都是意外死亡醉冤,警方通過查閱死者的電腦和手機(jī)秩霍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門篙悯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人铃绒,你說我怎么就攤上這事鸽照。” “怎么了匿垄?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長归粉。 經(jīng)常有香客問我椿疗,道長,這世上最難降的妖魔是什么糠悼? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任届榄,我火速辦了婚禮,結(jié)果婚禮上倔喂,老公的妹妹穿的比我還像新娘铝条。我一直安慰自己,他們只是感情好席噩,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布班缰。 她就那樣靜靜地躺著,像睡著了一般悼枢。 火紅的嫁衣襯著肌膚如雪埠忘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天馒索,我揣著相機(jī)與錄音莹妒,去河邊找鬼。 笑死绰上,一個(gè)胖子當(dāng)著我的面吹牛旨怠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蜈块,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼鉴腻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了百揭?” 一聲冷哼從身側(cè)響起拘哨,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎信峻,沒想到半個(gè)月后倦青,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盹舞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年产镐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了隘庄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡癣亚,死狀恐怖丑掺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情述雾,我是刑警寧澤街州,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站玻孟,受9級(jí)特大地震影響唆缴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜黍翎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一面徽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧匣掸,春花似錦趟紊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至送爸,卻和暖如春唧躲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背碱璃。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國打工弄痹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嵌器。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓肛真,卻偏偏與公主長得像,于是被迫代替她去往敵國和親爽航。 傳聞我的和親對象是個(gè)殘疾皇子蚓让,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容