溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

php8.0增加了哪些功能

發(fā)布時間:2020-06-29 13:37:32 來源:億速云 閱讀:390 作者:Leah 欄目:編程語言

php8.0增加了哪些功能?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

什么是JIT?

PHP實現(xiàn)了一個虛擬機,一種虛擬處理器,我們稱之為Zend VM。PHP將人類可讀的腳本編譯成虛擬機能夠理解的指令(我們稱之為操作碼),這個執(zhí)行階段就是我們所說的“編譯時”。在執(zhí)行的“運行時”階段,虛擬機(Zend VM)執(zhí)行代碼的指令(操作碼)。

這一切工作得很好,像APC(過去)和OPCache(現(xiàn)在)這樣的工具可以緩存代碼的指令(操作碼),以便“編譯時”只在必須的時候發(fā)生。

首先,有一行代碼解釋了什么是JIT:

Just-in-time 是一種編譯器策略,它接受代碼的中間表示形式,并在運行時將其轉(zhuǎn)換為依賴于體系結(jié)構(gòu)的機器代碼,以便及時執(zhí)行。

在PHP中,這意味著JIT將為Zend VM生成的指令作為中間表示,并發(fā)出依賴于體系結(jié)構(gòu)的機器代碼,因此代碼的宿主不再是ZendVM,而是CPU。

為什么PHP需要JIT?

在PHP 7.0之前,PHP內(nèi)部社區(qū)關(guān)注的焦點是性能,這是由Facebook的HHVM項目帶來的良性競爭帶來的。PHP 7.0中的大部分核心更改都包含在PHPNG補丁中,這大大改進了PHP在其核心上利用內(nèi)存和CPU的方式,從那時起,我們每個人都被迫關(guān)注性能。

自PHP 7.0以來,已經(jīng)有了一些性能改進,HashTable (PHP的核心數(shù)據(jù)結(jié)構(gòu))的優(yōu)化,某些操作碼的Zend VM的專門化,某些序列的編譯器的專門化,以及對OPCache的優(yōu)化器組件的不斷改進。。。除此之外還有很多其他的,太無聊了。

這是一個殘酷的事實,這些優(yōu)化只能帶我們到目前為止,我們正在迅速接近,或可能已經(jīng)遇到了磚墻,在我們的能力,以進一步改善它。

注意:當我們說“我們不能再改進了”時,我們真正的意思是,“我們必須做出取舍,以進一步改進它不再看起來有吸引力”。。。每當我們討論性能優(yōu)化時,我們都在討論權(quán)衡。通常,在簡單性和性能之間進行權(quán)衡。我們都想認為最簡單的代碼是最快的代碼,但在現(xiàn)代的C編程世界中,情況并非如此。最快的代碼通常是準備利用依賴于體系結(jié)構(gòu)的內(nèi)部函數(shù)或依賴于平臺(編譯器)的內(nèi)部函數(shù)的代碼。簡單并不能保證最好的性能。

此時,PHP的JIT功能似乎是從PHP獲得更多性能的最佳方法。

JIT會讓我的網(wǎng)站更快嗎?

很有可能,并不明顯。

也許不是您期望的答案:在一般情況下,用PHP編寫的應用程序是I/O綁定的,JITCPU綁定的代碼上工作得最好。

“I/O和CPU綁定”到底是什么意思?

當我們想要描述一段代碼或一個應用程序的一般性能特征時,我們使用術(shù)語I/O綁定CPU綁定

最簡單的說法是:

  • 如果我們能夠改進(減少、優(yōu)化)它所做的I/O,那么一段I/O綁定的代碼將會運行得更快。

  • 如果我們能夠改進(減少、優(yōu)化)CPU正在執(zhí)行的指令,或者(神奇地)提高CPU的時鐘速度,那么一段CPU限制的代碼就會運行得更快:)

  • 一段代碼或一個應用程序可以是I/O綁定、CPU綁定,或者與CPU和I/O同等綁定。

  • 一般來說,PHP應用程序往往是I/O綁定的——減慢它們速度的是它們正在執(zhí)行的I/O——連接、讀取和寫入數(shù)據(jù)庫、緩存、文件、套接字等等。

CPU綁定的PHP是什么樣子的?

由于大多數(shù)PHP應用程序的性質(zhì),許多PHP程序員并不熟悉CPU綁定代碼——他們的工作往往是連接到某個數(shù)據(jù)庫,或者可能是一個緩存,做一些輕量級的工作,并輸出html/json/xml響應。

您可能會環(huán)顧代碼庫,發(fā)現(xiàn)許多與I/O無關(guān)的代碼,甚至調(diào)用與I/O完全斷開連接的函數(shù)的代碼,并且會感到困惑,我似乎是在暗示這并沒有使您的應用程序CPU受到限制,即使處理非I/O的代碼行數(shù)可能比I/O多。

PHP實際上相當快,它是世界上解釋速度最快的語言之一。Zend VM調(diào)用與I/O無關(guān)的函數(shù)和在機器代碼中進行相同的調(diào)用之間沒有顯著的區(qū)別。

這顯然是有區(qū)別的,但事實是,機器代碼有一個調(diào)用約定,Zend VM有一個調(diào)用約定,機器代碼有一個序言,Zend VM有一個序言:在Zend操作碼中調(diào)用某個c_level_function()還是機器代碼對調(diào)用應用程序的性能沒有顯著影響-盡管這似乎對那個電話有很大的影響。

注意:調(diào)用約定大致是指在進入另一個函數(shù)之前執(zhí)行的一系列指令,序言是指在進入另一個函數(shù)時執(zhí)行的一系列指令:在這兩種情況下,調(diào)用約定都將參數(shù)推送到堆棧上,序言將它們從堆棧中彈出。

循環(huán)、尾調(diào)用和X呢?我聽說你問過:PHP實際上非常聰明,啟用了OPCache的優(yōu)化器組件,你的代碼就好像被魔法轉(zhuǎn)化成了你能編寫的最有效的形式。

現(xiàn)在需要注意的是,JIT不會改變Zend函數(shù)的調(diào)用約定,而不是VM建立的約定-Zend必須能夠在任何時候在JIT和VM模式之間切換,因此決定保留VM建立的調(diào)用約定。因此,當JIT運行時,隨處可見的那些調(diào)用并沒有明顯地加快速度。

如果您想了解CPU綁定的PHP代碼是什么樣子的,請查看Zend/bench.php文件... 這顯然是一個極限的CPU代碼示例,但它應該讓我們知道JIT真正的亮點是在數(shù)學領(lǐng)域。

PHP是否為加快數(shù)學速度做出了最終的權(quán)衡?

不,我們這樣做是為了擴大PHP的范圍,而且相當大。

在這個非常偏頗的PHP開發(fā)人員看來,如果你在2019年是一名web程序員,你還沒有考慮在下一個項目中使用PHP,那么你做的web是錯誤的。

在PHP中提高更快地執(zhí)行數(shù)學的能力,乍一看,似乎是一個非常狹窄的范圍。

然而,這實際上為機器學習、3d渲染、2d(gui)渲染和數(shù)據(jù)分析(僅舉幾個例子)打開了大門。

為什么我們不能在PHP 7.4中使用它呢?

我剛剛把JIT稱為“最終的權(quán)衡”,我認為它是:它可以說是有史以來最復雜的編譯器策略之一,也許是最復雜的。引入JIT就是引入相當?shù)膹碗s性。

如果你問Dmitry(JIT的作者)他是否讓PHP變得復雜,他會說“不,我討厭復雜性”(這是一個直接的引語)。

歸根結(jié)底,復雜是我們所不了解的,而目前,真正了解JIT實現(xiàn)的內(nèi)部開發(fā)人員(不到幾個)很少。

PHP 7.4的發(fā)展很快,合并到php7.4中會給我們留下一個PHP版本,只有不到幾個人可以調(diào)試、修復或改進(在任何實際意義上)。對于那些對合并到PHP 7.4投反對票的人來說,這種情況是不可接受的。

在從現(xiàn)在到PHP 8的這段時間里,我們中的許多人將在業(yè)余時間努力理解JIT:

我們?nèi)匀挥幸恍┮獙崿F(xiàn)的特性和需要為php8重寫的工具,首先我們必須理解JIT。我們需要這一次,并非常感謝大多數(shù)選民認為適合把它交給我們。

復雜并不是可怕的同義詞:

復雜可以是美麗的,就像星云一樣,JIT就是那種復雜。原則上,你可以完全理解某件復雜的事情,并且只在表面上的復雜程度上稍微降低一點。換句話說,即使有20個內(nèi)部開發(fā)人員和Dmitry一樣熟悉JIT,它也不會真正改變JIT的復雜性。

PHP的開發(fā)速度會減慢嗎?

沒有理由認為會這樣。我們有足夠的時間可以滿懷信心地說,到PHP 8普遍可用時,我們中已經(jīng)有足夠多的人熟悉JIT,至少在修復bug和推動PHP向前發(fā)展方面能夠像今天一樣發(fā)揮作用。

當試圖將這一點與JIT本質(zhì)上是復雜的觀點聯(lián)系起來時,請考慮我們花在引入新特性上的大部分時間實際上是花在討論該特性上的。對于大多數(shù)功能,甚至修復,代碼可能需要幾分鐘或幾小時的編寫時間,而討論則需要幾周或幾個月的時間。在極少數(shù)情況下,一個特性的代碼可能需要幾個小時或幾天的時間來編寫,但在這些極少數(shù)情況下,討論總是需要更長的時間。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI