回覆列表
-
1 # 瑞哥是我男神Shen
-
2 # IT程式設計教程分享
可以說PHP7.3版本的效能已經有了大幅度提高,可透過宏定義和行內函數(inline),讓編譯器提前完成部分工作
PHP 核心貢獻團隊花了許多心力減少程式運作時搬動的記憶體位數,由此加速執行的效能。例如,PHP 中儲存變數的資料架構 zval 從 24 位 縮減至 16 位、Hashtable 從 72 位減少至 56 位,並檢視 PHP 中的函式,思考有無任何改進效能的空間。
PHP7 Opcache的出現Zend引擎會將PHP程式碼解釋為可執行機器碼(Operate Code)之後再交由CPU執行。效能提升了一倍!等等還有很多不一一舉例了!
目前PHP7.4版本也快要出來了,整體比PHP7.0快 22% ;
PHPJIT+Swoole的結合效能僅次於Java和GO 既能快速動態開發也能支援高併發,實現微服務架構!
目前Swoole的定位是為高階PHPer所打造的,但並不妨礙初中級程式設計師去學習並掌握它,PHP併發程式設計、SWOOLE、Swoft微服務等是PHP程式設計師進階為高階工程師、架構師的必備技能!
學習PHP高階技術、進階中高階、架構師的PHPer可來提升自己漲薪!!!
PHP7將在2015年12月正式釋出,PHP7 ,將會是PHP指令碼語言的重大版本更新,同時將帶來大幅的效能改進和新的特性,以及改進一些過時功能。 該 釋出版本將會專注在效能加強,源自PHP版本樹中的phpng分支。在矽谷公司的ZendCon會議,PHP工具廠商Zend技術官方討論phpng和 PHP7的進度。“(本次升級)真正專注於幫助業界的應用程式顯著加強執行速度,再加上,我們在PHP中的其他改進,”Zend的執行長安迪特曼斯 (曾參與了PHP語言的持續開發和發展)表示。 我們來看看官網給出的php7 引擎和特性: PHP7引擎( What will be in PHP 7 / PHPNG )
Performance Improvements with the addition of PHPNG engine.(使用PHPNG引擎來提升效能) JIT - Just in Time compiler (即時編輯器 JIT Compiler_百度百科) Abstract Syntax Tree for compilation(抽象語法樹編譯) Asynchronous refactoring of the I/O layer. 對I/O層的非同步重構。 Multi-threaded build in Web Server多執行緒構建Web伺服器 Expanded use of ->, [], (), {}, and :: operators 擴充套件使用 ->, [], (), {}, 和 :: 符號 100% in crease in performance效能提升 100% (應該是QPS) Cool Name: PHPNG 酷名:PHPNG引擎
1) PHP7速度是 PHP5.6 的兩倍
X
2) JIT - Just in Time compiler (即時編輯器)
Just In Time(即時編譯)是一種軟體最佳化技術,指在執行時才會去編譯位元組碼為機器碼。從直覺出發,我們都很容易認為,機器碼是計算機能夠直接識別和執行的,比起Zend讀取opcode逐條執行效率會更高。其中,HHVM(HipHop Virtual Machine,HHVM是一個Facebook開源的PHP虛擬機器)就採用JIT,讓他們的PHP效能測試提升了一個數量級,放出一個令人震驚的測試結果,也讓我們直觀地認為JIT是一項點石成金的強大技術。
而實際上,在2013年的時候,鳥哥和Dmitry(PHP語言核心開發者之一)就曾經在PHP5.5的版本上做過一個JIT的嘗試(並沒有釋出)。PHP5.5的原來的執行流程,是將PHP程式碼透過詞法和語法分析,編譯成opcode位元組碼(格式和彙編有點像),然後,Zend引擎讀取這些opcode指令,逐條解析執行。
而他們在opcode環節後引入了型別推斷(TypeInf),然後透過JIT生成ByteCodes,然後再執行。
於是,在benchmark(測試程式)中得到令人興奮的結果,實現JIT後效能比PHP5.5提升了8倍。然而,當他們把這個最佳化放入到實際的專案WordPress(一個開源部落格專案)中,卻幾乎看不見效能的提升,得到了一個令人費解的測試結果。
於是,他們使用Linux下的profile型別工具,對程式執行進行CPU耗時佔用分析。
執行100次WordPress的CPU消耗的分佈:
註解:
21%CPU時間花費在記憶體管理。
12%CPU時間花費在hash table操作,主要是PHP陣列的增刪改查。
30%CPU時間花費在內建函式,例如strlen。
25%CPU時間花費在VM(Zend引擎)。
經過分析之後,得到了兩個結論:
(1)JIT生成的ByteCodes如果太大,會引起CPU快取命中率下降(CPU Cache Miss)
在PHP5.5的程式碼裡,因為並沒有明顯型別定義,只能靠型別推斷。儘可能將可以推斷出來的變數型別,定義出來,然後,結合型別推斷,將非該型別的分支程式碼去掉,生成直接可執行的機器碼。然而,型別推斷不能推斷出全部型別,在WordPress中,能夠推斷出來的型別資訊只有不到30%,能夠減少的分支程式碼有限。導致JIT以後,直接生成機器碼,生成的ByteCodes太大,最終引起CPU快取命中大幅度下降(CPU Cache Miss)。
CPU快取命中是指,CPU在讀取並執行指令的過程中,如果需要的資料在CPU一級快取(L1)中讀取不到,就不得不往下繼續尋找,一直到二級快取(L2)和三級快取(L3),最終會嘗試到記憶體區域裡尋找所需要的指令資料,而記憶體和CPU快取之間的讀取耗時差距可以達到100倍級別。所以,ByteCodes如果過大,執行指令數量過多,導致多級快取無法容納如此之多的資料,部分指令將不得不被存放到記憶體區域。
CPU的各級快取的大小也是有限的,下圖是Intel i7 920的配置資訊:
因此,CPU快取命中率下降會帶來嚴重的耗時增加,另一方面,JIT帶來的效能提升,也被它所抵消掉了。
透過JIT,可以降低VM的開銷,同時,透過指令最佳化,可以間接降低記憶體管理的開發,因為可以減少記憶體分配的次數。然而,對於真實的WordPress專案來說,CPU耗時只有25%在VM上,主要的問題和瓶頸實際上並不在VM上。因此,JIT的最佳化計劃,最後沒有被列入該版本的PHP7特性中。不過,它很可能會在更後面的版本中實現,這點也非常值得我們期待哈。
(2)JIT效能的提升效果取決於專案的實際瓶頸
JIT在benchmark中有大幅度的提升,是因為程式碼量比較少,最終生成的ByteCodes也比較小,同時主要的開銷是在VM中。而應用在WordPress實際專案中並沒有明顯的效能提升,原因WordPress的程式碼量要比benchmark大得多,雖然JIT降低了VM的開銷,但是因為ByteCodes太大而又引起CPU快取命中下降和額外的記憶體開銷,最終變成沒有提升。
不同型別的專案會有不同的CPU開銷比例,也會得到不同的結果,脫離實際專案的效能測試,並不具有很好的代表性。
3). Zval的改變
PHP的各種型別的變數,其實,真正儲存的載體就是Zval,它特點是海納百川,有容乃大。從本質上看,它是C語言實現的一個結構體(struct)。對於寫PHP的同學,可以將它粗略理解為是一個類似array陣列的東西。
PHP5的Zval,記憶體佔據24個位元組:
PHP7的Zval,記憶體佔據16個位元組:
Zval從24個位元組下降到16個位元組,為什麼會下降呢,這裡需要補一點點的C語言基礎,輔助不熟悉C的同學理解。struct和union(聯合體)有點不同,Struct的每一個成員變數要各自佔據一塊獨立的記憶體空間,而union裡的成員變數是共用一塊記憶體空間(也就是說修改其中一個成員變數,公有空間就被修改了,其他成員變數的記錄也就沒有了)。因此,雖然成員變數看起來多了不少,但是實際佔據的記憶體空間卻下降了。
除此之外,還有被明顯改變的特性,部分簡單型別不再使用引用。