国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
PHP 8 的 JIT
PHP的程式碼是怎麼執(zhí)行的?
Opcache 擴(kuò)充功能
Just In Time 編譯有什麼效果?
那麼 Just In Time 編譯是怎麼做的?
所以你的效能收益可能不會很大
首頁 後端開發(fā) PHP8 一文深入了解 PHP 8 中的 JIT

一文深入了解 PHP 8 中的 JIT

Apr 25, 2022 pm 08:46 PM
php php8

這篇文章帶大家了解一下PHP 8 中的 JIT,並聊聊JIT 是怎麼參與解釋流程的,希望對大家有幫助!

一文深入了解 PHP 8 中的 JIT

PHP 8 的JIT(Just In Time)編譯器將作為擴(kuò)充整合到php 中?Opcache 擴(kuò)充?用於執(zhí)行時間將某些操作碼直接轉(zhuǎn)換為從cpu 指令。

這表示使用JIT後,Zend VM 不需要解釋某些操作碼,而這些指令將直接作為CPU級指令執(zhí)行。

PHP 8 的 JIT

PHP 8 Just In Time(JIT)編譯器帶來的影響是毋庸置疑的。但到目前為止,我發(fā)現(xiàn)關(guān)於 JIT 應(yīng)該做什麼卻知之甚少。

經(jīng)過多次研究和放棄,我決定親自檢查PHP原始碼。結(jié)合我對C語言的一些知識和我目前收集到的所有零散信息,我提出了這篇文章,我希望它能幫助您更好地理解PHP的JIT。

簡單一點來說 : 當(dāng)JIT如預(yù)期運(yùn)作時,您的程式碼不會透過Zend VM執(zhí)行,而是作為一組CPU級指令直接執(zhí)行。

這就是全部的想法。

但為了更好地理解它,我們需要考慮php如何在內(nèi)部運(yùn)作。不是很複雜,但需要一些介紹。

我寫了一篇部落格文章,大致概述了php的工作原理。如果你覺得這篇文章寫太多了,就去查另一篇,稍後再來。事情會變得更容易理解。

PHP的程式碼是怎麼執(zhí)行的?

總所周知, PHP 是解釋型語言,但這句話本身是什麼意思呢?

每次執(zhí)行 PHP 程式碼(命令列腳本或 WEB 應(yīng)用程式)時,都要經(jīng)過 PHP 解譯器。最常用的是 PHP-FPM 和 CLI 解譯器。

解釋器的工作很簡單:接收 PHP 程式碼,對其進(jìn)行解釋,然後傳回結(jié)果。

一般的解釋型語言都是這個流程。有些語言可能會減少幾個步驟,但總體的思路相同。在 PHP 中,這個流程如下:

  • 讀取 PHP 程式碼並將其解釋為一組稱為 Tokens 的關(guān)鍵字。這個過程讓解釋器知道各個程式都寫了哪些程式碼。 這一步稱為 Lexing 或 Tokenizing 。

  • 拿到 Tokens 集合以後,PHP解譯器會試著解析他們。透過稱為 Parsing 的過程產(chǎn)生抽象語法樹(AST)。這裡 AST 是一個節(jié)點集表示要執(zhí)行哪些動作。例如,「 echo 1 1 」實際意義是 「印 1 1 的結(jié)果」 或者更詳細(xì)的說 「印出一個動作,這個動作是 1 1」。

  • 有了 AST ,可以更輕鬆地理解操作和優(yōu)先順序。將抽象語法樹轉(zhuǎn)換成可以被 CPU 執(zhí)行的操作需要一個用於過渡的表達(dá)式(IR),在 PHP 中我們稱為 Opcodes 。將 AST 轉(zhuǎn)換為 Opcodes 的過程稱為 compilation 。

  • 有了 Opcodes ,有趣的部分就來了: executing 程式碼!?PHP 有一個稱為 Zend VM 的引擎,該引擎能夠接??收一系列 Opcodes 並執(zhí)行它們。執(zhí)行所有 Opcodes 後, Zend VM 就會將程式終止。

這個圖可以讓你更清楚:

一文深入了解 PHP 8 中的 JIT

#一個簡化版的 PHP 解釋流程概述。

如你所見。這裡有個問題:即使 PHP 程式碼沒改變,每次執(zhí)行還是會走此流程嗎?

讓我們看回 Opcodes 。對了!這就是 Opcache 擴(kuò)充 存在的原因。

Opcache 擴(kuò)充功能

Opcache 擴(kuò)充是 PHP 附帶的,通常沒必要停用它。使用 PHP 最好開啟 Opcache 。

它的作用是為 Opcodes 增加一個記憶體共享快取層。它的工作是從 AST 中提取新生成的 Opcodes 並快取它們,以便執(zhí)行時可以跳過 Lexing/Tokenizing 和 Parsing 步驟。

這是包含 Opcache 擴(kuò)充功能的流程示意圖:

一文深入了解 PHP 8 中的 JIT

PHP 使用 Opcache 的解釋流程。如果檔案已經(jīng)被解析,則 PHP 會為其取得快取的 Opcodes ,而不是再次解析。

完美的跳過了 Lexing/Tokenizing 、 Parsing 和 Compiling 步驟 ? 。

附註:?這是超讚的?PHP 7.4 預(yù)先載入功能 RFC ?! 允許你告訴 PHP FPM 解析程式碼庫,將其轉(zhuǎn)換為 Opcodes 並且在執(zhí)行之前就將其快取。

你想知道JIT是怎麼參與這個解釋流程的嗎?這篇文章的將說明。

Just In Time 編譯有什麼效果?

聽了 Zeev 在 PHP Internals News 發(fā)表的 PHP 和 JIT 廣播 之後,我弄清楚了 JIT 實際做了什麼事情。

如果說 Opcache 擴(kuò)充功能可以更快的取得 Opcodes 將其直接轉(zhuǎn)到 Zend VM,則 JIT 讓它們完全不使用 Zend VM 即可運(yùn)作。

Zend VM 是用 C 編寫的程序,可作為 Opcodes 和 CPU 之間的一層。 JIT 在執(zhí)行階段直接產(chǎn)生編譯後的程式碼,因此 PHP 可以跳過 Zend VM 並直接被 CPU 執(zhí)行。 從理論上說,性能會更好。

這聽起來很奇怪,因為在編譯成機(jī)器碼之前,需要為每種類型的結(jié)構(gòu)體寫一個具體的實作。但其實這也是合理的。

PHP 的 JIT 使用了名為?DynASM (Dynamic Assembler) ?的函式庫,該函式庫將特定格式的一組 CPU 指令對應(yīng)為許多不同 CPU 類型的彙編程式碼。因此,編譯器只需要使用 DynASM 就可以將 Opcodes 轉(zhuǎn)換為特定結(jié)構(gòu)體的機(jī)器碼。

但是,有一個問題困擾了我很久。

如果預(yù)先載入能夠在執(zhí)行之前將PHP 程式碼解析為Opcodes,而DynASM 可以將Opcodes 編譯為機(jī)器碼(Just In Time 編譯) ,為什麼我們不立即使用執(zhí)行前編譯(Ahead of Time 編譯) 立刻編譯PHP 呢?

透過收聽 Zeev 的廣播,我找到的原因之一是 PHP 是弱型別語言,這表示在 Zend VM 嘗試執(zhí)行某個操作碼之前, PHP 通常不知道變數(shù)的型別。

可以查看?Zend_value 聯(lián)合類型 得知, 很多指標(biāo)指向不同類型的變數(shù)。每當(dāng) Zend VM 嘗試從 Zend_value 取得值時,它都會使用像?ZSTR_VAL?這樣的宏,取得聯(lián)合類型中字串的指標(biāo)。

例如,這個 Zend VM handler 是處理「小於或等於」(

使用機(jī)器碼執(zhí)行類型推斷邏輯是不可行的,並且可能變得更慢。

先求值再編譯也不是個好選擇,因為編譯成機(jī)器碼就是 CPU 密集型任務(wù)。因此,在運(yùn)行時編譯所有內(nèi)容也不好。

那麼 Just In Time 編譯是怎麼做的?

現(xiàn)在我們知道無法很好的推論類型來提前編譯。我們也知道在運(yùn)行時進(jìn)行編譯的運(yùn)算成本很高。那麼 JIT 對 PHP 有何好處呢?

為了尋求平衡, PHP 的 JIT 嘗試只編譯有價值的 Opcodes 。為此, JIT 會分析 Zend VM 要執(zhí)行的 Opcodes 並檢查可能編譯的地方。 (根據(jù)設(shè)定檔)

當(dāng)某個 Opcode 編譯後,它將把執(zhí)行交給該編譯後的程式碼,而不是交給 Zend VM ??雌饋砣缦拢?/p>

一文深入了解 PHP 8 中的 JIT

PHP 的 JIT 解釋流程。如果已編譯,則 Opcodes 不會透過 Zend VM 執(zhí)行。

因此,在 Opcache 擴(kuò)充中,有兩個偵測指令判斷要不要編譯 Opcode 。如果要,編譯器將使用 DynASM 將此 Opcode 轉(zhuǎn)換為機(jī)器碼,並執(zhí)行此機(jī)器碼。

有趣的是,由於目前介面中編譯的程式碼有 MB 的限制(也是可設(shè)定的),所以程式碼執(zhí)行必須能夠在 JIT 和解釋程式碼之間無縫切換。

順便說一句,Benoit Jacquemont 在 php 的 JIT 上的這篇演講幫助我理解了這整件事。

我仍然不確定編譯部分什麼時候有效進(jìn)行,但我想現(xiàn)在我真的不想知道。

所以你的效能收益可能不會很大

我希望現(xiàn)在大家都很清楚為什麼大多數(shù) php 應(yīng)用程式不會因為使用即時編譯器而獲得很大的效能效益。這也是為什麼 Zeev 建議為你的應(yīng)用程式分析和試驗不同的 JIT 配置是最好的方法。

如果您使用的是PHP FPM,則通常會在多個請求之間共用已編譯的操作碼,但這仍然不能改變遊戲規(guī)則。

這是因為JIT優(yōu)化了計算密集型的操作,而如今大多數(shù)php應(yīng)用程式比其他任何東西都更受I/O約束. 如果您無論如何都要訪問磁碟或網(wǎng)絡(luò),則處理操作是否已編譯則無關(guān)緊要。時間上將非常相似。

除非…

你正在做一些不受I/O約束的事情, 像是圖像處理或機(jī)器學(xué)習(xí)。任何不接觸I/O的東西都將受益於JIT編譯器。

這也是為什麼現(xiàn)在人們說我們更願意用PHP寫原生功能而不是C寫的原因。如果仍然要編譯此功能,則開銷將毫無表現(xiàn)力。

有趣的時光成為一個PHP程式設(shè)計師…


希望本文對您有幫助,讓您能更好的理解PHP8的JIT。


原文網(wǎng)址:https://thephp.website/en/issue/php-8-jit/

推薦:《PHP視頻教程

以上是一文深入了解 PHP 8 中的 JIT的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

我如何了解最新的PHP開發(fā)和最佳實踐? 我如何了解最新的PHP開發(fā)和最佳實踐? Jun 23, 2025 am 12:56 AM

TostaycurrentwithPHPdevelopmentsandbestpractices,followkeynewssourceslikePHP.netandPHPWeekly,engagewithcommunitiesonforumsandconferences,keeptoolingupdatedandgraduallyadoptnewfeatures,andreadorcontributetoopensourceprojects.First,followreliablesource

什麼是PHP,為什麼它用於Web開發(fā)? 什麼是PHP,為什麼它用於Web開發(fā)? Jun 23, 2025 am 12:55 AM

PHPbecamepopularforwebdevelopmentduetoitseaseoflearning,seamlessintegrationwithHTML,widespreadhostingsupport,andalargeecosystemincludingframeworkslikeLaravelandCMSplatformslikeWordPress.Itexcelsinhandlingformsubmissions,managingusersessions,interacti

如何設(shè)置PHP時區(qū)? 如何設(shè)置PHP時區(qū)? Jun 25, 2025 am 01:00 AM

tosetTherightTimeZoneInphp,restate_default_timezone_set()functionAtthestArtofyourscriptWithavalIdidentIdentifiersuchas'america/new_york'.1.usedate_default_default_timezone_set_set()

編寫清潔和可維護(hù)的PHP代碼的最佳實踐是什麼? 編寫清潔和可維護(hù)的PHP代碼的最佳實踐是什麼? Jun 24, 2025 am 12:53 AM

寫乾淨(jìng)、易維護(hù)的PHP代碼關(guān)鍵在於清晰命名、遵循標(biāo)準(zhǔn)、合理結(jié)構(gòu)、善用註釋和可測試性。 1.使用明確的變量、函數(shù)和類名,如$userData和calculateTotalPrice();2.遵循PSR-12標(biāo)準(zhǔn)統(tǒng)一代碼風(fēng)格;3.按職責(zé)拆分代碼結(jié)構(gòu),使用MVC或Laravel式目錄組織;4.避免麵條式代碼,將邏輯拆分為單一職責(zé)的小函數(shù);5.在關(guān)鍵處添加註釋並撰寫接口文檔,明確參數(shù)、返回值和異常;6.提高可測試性,採用依賴注入、減少全局狀態(tài)和靜態(tài)方法。這些做法提升代碼質(zhì)量、協(xié)作效率和後期維護(hù)便利性。

如何使用PHP執(zhí)行SQL查詢? 如何使用PHP執(zhí)行SQL查詢? Jun 24, 2025 am 12:54 AM

Yes,youcanrunSQLqueriesusingPHP,andtheprocessinvolveschoosingadatabaseextension,connectingtothedatabase,executingqueriessafely,andclosingconnectionswhendone.Todothis,firstchoosebetweenMySQLiorPDO,withPDObeingmoreflexibleduetosupportingmultipledatabas

如何在PHP中使用頁面緩存? 如何在PHP中使用頁面緩存? Jun 24, 2025 am 12:50 AM

PHP頁面緩存可通過減少服務(wù)器負(fù)載和加快頁面加載速度提升網(wǎng)站性能。 1.基本文件緩存通過生成靜態(tài)HTML文件並在有效期內(nèi)提供服務(wù),避免重複生成動態(tài)內(nèi)容;2.啟用OPcache可將PHP腳本編譯為字節(jié)碼存儲在內(nèi)存中,提升執(zhí)行效率;3.對帶參數(shù)的動態(tài)頁面,應(yīng)根據(jù)URL參數(shù)分別緩存,並避免緩存用戶特定內(nèi)容;4.可使用輕量級緩存庫如PHPFastCache簡化開發(fā)並支持多種存儲驅(qū)動。結(jié)合這些方法能有效優(yōu)化PHP項目的緩存策略。

如何快速測試PHP代碼片段? 如何快速測試PHP代碼片段? Jun 25, 2025 am 12:58 AM

toquicklytestaphpcodesnippet,useanonlinephpsandboxlike3v4l.orgorphpize.onlineforinstantantantExecutionWithOutSetup; runco????delocalocallocallocallocallocallocallywithpplibycreatinga.phpfileandexecutingitviateringitviatheterminal;

如何在PHP(&&,||,!,!,或XOR)中使用邏輯運(yùn)算符? 如何在PHP(&&,||,!,!,或XOR)中使用邏輯運(yùn)算符? Jun 23, 2025 am 12:56 AM

在PHP中,邏輯運(yùn)算符用於組合或評估條件,主要的運(yùn)算符包括&&、and、||、or、!和xor。 1.&&與and的區(qū)別在於優(yōu)先級,&&優(yōu)先級高於賦值運(yùn)算符,而and則低於賦值運(yùn)算符,因此在結(jié)合賦值時行為不同;2.||和or也有類似的優(yōu)先級差異,||優(yōu)先於賦值,而or在賦值之後處理;3.!運(yùn)算符用於取反布爾值,常用於檢查條件是否為假,並建議用括號包裹複雜表達(dá)式以確保正確應(yīng)用;4.xor僅當(dāng)兩個值中恰好有一個為true時返回true,適用於互斥條件判斷

See all articles