您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關PHP7和HHVM的性能對比,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
HHVM是一個開源的PHP虛擬機,使用JIT的編譯方式以及其他技術,讓PHP代碼的執行性能大幅提升。據傳,可以將當前版本的原生PHP代碼提升5-10倍的執行性能。
HHVM起源于Facebook公司,Facebook早起的很多代碼是使用PHP來開發的,但是,隨著業務的快速發展,PHP執行效率成為越來越明顯的問題。為了優化執行效率,Facebook在2008年就開始使用HipHop,這是一種PHP執行引擎,最初是為了將Fackbook的大量PHP代碼轉成 C++,以提高性能和節約資源。使用HipHop的PHP代碼在性能上有數倍的提升。后來,Facebook將HipHop平臺開源,逐漸發展為現在的HHVM。
1. PHP為什么慢?
PHP的慢是相對于C/C++級別的語言來說,事實上,PHP語言最初的設計,就不是用來解決計算密集型的應用場景。我們可以這樣粗略理解為,PHP為了提升開發效率,而犧牲了執行效率。
我們知道PHP一個很大的特點,就是弱類型特性,也就是說,我可以隨意定義一個變量,然后給它隨意賦值為各種類型的數據。以一個int整型數字為例子,在C語言中:
int num = 200; // 通常是4字節
但是,如果是PHP定義了一個同樣的變量,實際對應的存儲結構則是:
這個結構體將會占據遠比C變量多得多的內存,PHP中定義方式如下:
$a = 200;//這變量將實際占用對比C變量很多倍的存儲空間。
其實對PHP來說,無論存儲什么類型的數據,都是用上述“通殺”的結構體實現。為了兼容PHP程序員的變量類型“亂入”,PHP做到了對開發者的友好,但是對執行引擎很殘酷。單個變量內存消耗可能還不明顯,一旦用到PHP的數組等,則復雜度指數上升(數組的實現是HashTable)。然后,Zend引擎執行時,將這些PHP代碼編譯為opcode(PHP的中間字節碼,格式有點類似于匯編),由Zend引擎逐行解釋執行。
無論是字符串的連接操作,還是數組的簡單修改等,幾乎都是“PHP程序員一句話,Zend引擎跑斷腿”的節奏。因此,同樣的操作,對比C來說,PHP消耗了更多的CPU和內存等系統資源。除此之外,還有內存自動回收、變量類型判斷等等,都會增加系統資源的消耗。
原生的sort耗時3.44 ms,而我們自己實現的PHP函數sort則是68.79 ms。我們發現,兩者執行效率差距巨大。我的測試方式,是計算函數執行前后的時間間隔,而不是整個PHP腳本從啟動到結束的時間。PHP腳本啟動和關閉過程,本身有著一系列的初始化和清理工作,也會占據不少的耗時。
通常情況下,PHP執行效率的排行是:
在一般情況下,我們并不推薦用過PHP實現邏輯復雜計算類型的功能,尤其是Web系統流量比較大的場景下。因此,PHP程序員應該對PHP的各種原生函數和各類拓展有一個比較廣泛的了解,在具體的功能實現場景中,尋求更原生的解決方案(原生接口或者拓展),而不是自己寫一堆復雜的PHP代碼來實現這類型功能。
如果有足夠的PHP拓展開發實力,將這類型業務功能重寫為一個PHP拓展,也會大幅提升代碼的執行效率。這是一個非常不錯的方式,也被廣泛應用PHP優化中。但是,自己編寫的PHP業務拓展的缺點也很明顯:
實際上,在互聯網一線企業中,更常見的解決方案,并非增加PHP拓展,而用C/C++獨立寫一個服務server,然后PHP通過socket和服務server通信來完成業務處理,并不將PHP本身和業務耦合在一起。
不過,Web服務大部分的性能瓶頸都在網絡傳輸和其他服務server的耗時上(例如MySQL等),PHP執行的耗時在整體耗時的占用比例非常小,所以從業務角度來說,影響可能并不明顯。
2. HHVM提升PHP執行性能的方式
HHVM提升PHP性能的途徑,采用的方式就是替代Zend引擎來生成和執行PHP的中間字節碼(HHVM生成自己格式的中間字節碼),執行時通過JIT(Just In Time,即時編譯是種軟件優化技術,指在運行時才會去編譯字節碼為機器碼)轉為機器碼執行。Zend引擎默認做法,是先編譯為opcode,然后再逐條執行,通常每條指令對應的是C語言級別的函數。如果我們產生大量重復的opcode(純PHP寫的代碼和函數),對應的則是Zend多次逐條執行這些C代碼。而JIT所做的則是更進一步,將大量重復執行的字節碼在運行的時候編譯為機器碼,達到提高執行效率的目的。通常,觸發JIT的條件是代碼或者函數被多次重復調用。
普通的PHP代碼,因為無法固定變量的類型,需要額外添加判斷類型的邏輯代碼,這樣PHP代碼是不利于CPU執行和優化的。因此,HHVM通常需要用到Hack寫法(為了兼容某種特性而額外添加的技巧性質的代碼)的PHP代碼來“配合”,就是為了讓變量類型固定,方便虛擬機編譯執行。PHP追求以一種形式來容納一切類型,而Hack則可以將被容納的一切標記上確定的類型。
PHP代碼的Hack寫法的例子:
上面的例子中,PHP代碼主要被添加上了變量類型。Hack寫法的總體方向,就是將之前“動態”的寫法變為“靜態”的寫法,來配合HHVM。
HHVM因為它的高性能而吸引了不少人的關注,一些一線互聯網公司也開始跟進使用。從純語言執行性能測試結果來看,HHVM領先了開發中的PHP7版本不少。
不過,從具體業務場景來看,HHVM和PHP7的差距并沒有那么大,以WordPress開源博客首頁為測試場景的結果中,他們目前的差距并不明顯。
但是,PHP7目前還在開發中,就已經可用的技術方案來看,目前的HHVM略勝一籌。不過,HHVM的部署和應用都存在一些的問題:
HHVM畢竟是一個相對比較新的開源項目,發展到成熟仍然需要一定時間。
PHP長期以來飽受批評的性能問題,將會在這個版本得到大幅度的改善。版本中間沒有PHP6哈,據說,是因為這個版本曾經立過項目,后來大部分功能都在5.x的版本里實現了,為了避免混淆,下一個大版本直接就是PHP7。(幾年以前,我還看到過關于PHP6的書籍。)
1. PHP7的介紹
雖然PHP7的正式版本可能要到2015年的10月份才發布,不過明年6月份應可以看見一個測試版本了,之后是3-4個月的質量保證。
PHP社區的項目計劃如下:
因為項目仍然處于開發中的原因,從表格中,可以看見的特性描述都比較模糊。肯定有更多的其他特性,只是尚未公布。下面的這些,是從PHP社區看見的,因為PHP7是一個開發中的項目,下面的這些也不一定準確,不過,不妨礙我們一起來看看。
上面的特性中,最令人期待的就是PHPng的性能優化,PHP社區已經放出了一些性能的測速數據。從數據上看,PHPng的執行性能比起項目啟動之初,已經有接近1倍的提升。這個成績已經非常不錯,況且,最關鍵的是PHP7的優化計劃還有很多尚未完成。等到都全部完成了,相信我們可以看見一個性能更高的PHP7。
這測速數據是來自于PHP社區(wiki.php.net/phpng),截取了一部分的數據:
對其當前PHP5.6版本,PHPNG的10月份性能提升已經非常明顯了:
簡單翻譯下:
2. PHP的弱類型爭議
PHP被爭議的特點很多,但是隨著語言版本的發布和完善,功能和特性方面的批評開始變少了。但是,PHP的“弱類型”特性,卻明顯受到更多的爭議,從HHVM通過Hack的方式直接“去掉”了“弱類型”特性可以看出,HHVM并不喜歡“弱類型”特性。然而,在我們很多PHP程序員的眼中,這卻是PHP的重要優點之一。PHP里的變量被設計得隨性和飄逸,海納百川,一切皆可包容,不是讓語言顯得更為簡單嗎?
實際上,有些人認為它是個嚴重的問題,對于“弱類型”的批評觀點大致如下:
他們認為,這些都不符合“所見即所得”的簡單性,而語法嚴謹的語言更高效率,也更容易“理解”。
受到類似批評的還有Javascript等語言,因為它在這個問題上的表現是一樣的。但是,一門語言最終被大規模使用,必然有它們的道理。PHP成為Web服務開發的首選腳本語言,Javascript則直接稱霸Web前端領域,能走到這一步都不可能是偶然因素,開發者們用腳投票選擇了它們。編程語言是人類和機器溝通的橋梁,終極追求是實現“人人皆可編程”的宏偉目標。
縱觀語言發展歷史,從0和1的機器碼開始,到匯編語言,然后到C語言,再到動態腳本語言PHP。執行效率呈指數下降,但是,學習門檻也呈指數降低。PHP語言不僅屏蔽了C的內存管理和指針的復雜性,而且更進一步屏蔽了變量類型的復雜性。提升了項目開發的效率,降低了學習的門檻,但同時犧牲了一定的執行性能。然后,HHVM的Hack給我們一種“回歸原始”的感覺,重新引入了變量的復雜性。當然,不同的語言解決不同場景下的問題,并不能夠一概而論。
看完上述內容,你們對PHP7和HHVM的性能對比有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。