- 相關(guān)推薦
了解PHP7的革新與性能優(yōu)化
PHP 7.0被號稱為新一代的PHP,官方直接跳過了php 6版本(為什么跳過PHP6),將在2015年10月發(fā)布。他的重要特性主要體現(xiàn)在性能方面,據(jù)稱性能實(shí)現(xiàn)跨越式的大幅提升。
官方開發(fā)組對Zend引擎底層做了大量優(yōu)化來提升PHP的性能。開發(fā)者聲稱其性能兩倍于PHP 5。對PHP 7.0 RC2的測試顯示, 這一說法是精確的,其實(shí)還是保守估計。評測結(jié)果顯示:PHP 7.0的速度是PHP 5.3~5.6的2~2.5倍,同時占用的內(nèi)存更少。這次PHP7的革新一定會給Web服務(wù)帶來更深刻的變化,它已經(jīng)接近Facebook開發(fā)的PHP執(zhí)行引擎HHVM,后者通過將PHP代碼動態(tài)翻譯成原生機(jī)器碼而大幅提高速度。
除了性能的優(yōu)化外,其中最值得一提的就是JIT了。
Just In Time(即時編譯)是一種軟件優(yōu)化技術(shù),指在運(yùn)行時才會去編譯字節(jié)碼為機(jī)器碼。從直覺出發(fā),我們都很容易認(rèn)為,機(jī)器碼是計算機(jī)能夠直接識別和執(zhí)行的,比起Zend讀取opcode逐條執(zhí)行效率會更高。其中,HHVM(HipHop Virtual Machine,HHVM是一個Facebook開源的PHP虛擬機(jī))就采用JIT,讓他們的PHP性能測試提升了一個數(shù)量級,放出一個令人震驚的測試結(jié)果,也讓我們直觀地認(rèn)為JIT是一項(xiàng)點(diǎn)石成金的強(qiáng)大技術(shù)。
在PHP5.5的代碼里,因?yàn)椴]有明顯類型定義,只能靠類型推斷。盡可能將可以推斷出來的變量類型,定義出來,然后,結(jié)合類型推斷,將非該類型的分支代碼去掉,生成直接可執(zhí)行的機(jī)器碼。然而,類型推斷不能推斷出全部類型,在WordPress中,能夠推斷出來的類型信息只有不到30%,能夠減少的分支代碼有限。導(dǎo)致JIT以后,直接生成機(jī)器碼,生成的ByteCodes太大,最終引起CPU緩存命中大幅度下降(CPU Cache Miss)。通過JIT,可以降低VM的開銷,同時,通過指令優(yōu)化,可以間接降低內(nèi)存管理的開發(fā),因?yàn)榭梢詼p少內(nèi)存分配的次數(shù)。然而,對于真實(shí)的WordPress項(xiàng)目來說,CPU耗時只有25%在VM上,主要的問題和瓶頸實(shí)際上并不在VM上。
特別需要大家知道的是:做為業(yè)內(nèi)知名的在線平臺《慕課網(wǎng)》也已經(jīng)發(fā)布了最新的PHP7.0新特性詳解課程(http://www.imooc.com/view/438 Rango主講)
PHP 7.0.0 RC 1 現(xiàn)已提供下載(https://downloads.php.net/ab/),Windows 源代碼和二進(jìn)制提供在( windows.php.net/qa/)。
新增特性和改變
1. 標(biāo)量類型和返回類型聲明(Scalar Type Declarations & Scalar Type Declarations)
PHP語言一個非常重要的特點(diǎn)就是“弱類型”,它讓PHP的程序變得非常容易編寫,新手接觸PHP能夠快速上手,不過,它也伴隨著一些爭議。支持變量類型的定義,可以說是革新性質(zhì)的變化,PHP開始以可選的方式支持類型定義。除此之外,還引入了一個開關(guān)指令declare(strict_type=1);,當(dāng)這個指令一旦開啟,將會強(qiáng)制當(dāng)前文件下的程序遵循嚴(yán)格的函數(shù)傳參類型和返回類型。
2. 更多的Error變?yōu)榭刹东@的Exception
PHP7實(shí)現(xiàn)了一個全局的throwable接口,原來的Exception和部分Error都實(shí)現(xiàn)了這個接口(interface), 以接口的方式定義了異常的繼承結(jié)構(gòu)。于是,PHP7中更多的Error變?yōu)榭刹东@的Exception返回給開發(fā)者,如果不進(jìn)行捕獲則為Error,如果捕獲就變?yōu)橐粋可在程序內(nèi)處理的Exception。這些可被捕獲的Error通常都是不會對程序造成致命傷害的Error,例如函數(shù)不存。PHP7進(jìn)一步方便開發(fā)者處理,讓開發(fā)者對程序的掌控能力更強(qiáng)。因?yàn)樵谀J(rèn)情況下,Error會直接導(dǎo)致程序中斷,而PHP7則提供捕獲并且處理的能力,讓程序繼續(xù)執(zhí)行下去,為程序員提供更靈活的選擇。
3. AST(Abstract Syntax Tree,抽象語法樹)
AST在PHP編譯過程作為一個中間件的角色,替換原來直接從解釋器吐出opcode的方式,讓解釋器(parser)和編譯器(compliler)解耦,可以減少一些Hack代碼,同時,讓實(shí)現(xiàn)更容易理解和可維護(hù)。
4. Native TLS(Native Thread local storage,原生線程本地存儲)
PHP在多線程模式下(例如,Web服務(wù)器Apache的woker和event模式,就是多線程),需要解決“線程安全”(TS,Thread Safe)的問題,因?yàn)榫程是共享進(jìn)程的內(nèi)存空間的,所以每個線程本身需要通過某種方式,構(gòu)建私有的空間來保存自己的私有數(shù)據(jù),避免和其他線程相互污染。而PHP5采用的方式,就是維護(hù)一個全局大數(shù)組,為每一個線程分配一份獨(dú)立的存儲空間,線程通過各自擁有的key值來訪問這個全局?jǐn)?shù)據(jù)組。
而這個獨(dú)有的key值在PHP5中需要傳遞給每一個需要用到全局變量的函數(shù),PHP7認(rèn)為這種傳遞的方式并不友好,并且存在一些問題。因而,嘗試采用一個全局的線程特定變量來保存這個key值。
【了解PHP7的革新與性能優(yōu)化】相關(guān)文章:
分析PHP7性能優(yōu)化提升技巧07-12
PHP7性能翻倍關(guān)鍵大揭秘07-25
Java性能優(yōu)化的技巧10-19
PHP性能優(yōu)化的技巧07-18
PHP性能優(yōu)化技巧09-22
php7優(yōu)化提升技巧11-01
Java性能優(yōu)化技巧大全07-12
PS性能優(yōu)化通用技巧11-01
PHP性能優(yōu)化小技巧06-27