成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

了解一下PHP 8的 JIT 特性!

本篇文章給大家介紹一下PHP 8 的 JIT特性。有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)大家有所幫助。

了解一下PHP 8的 JIT 特性!

TL;DR

PHP 8 的 JIT(Just In Time)編譯器將作為擴(kuò)展集成到 php 中 Opcache 擴(kuò)展 用于運(yùn)行時(shí)將某些操作碼直接轉(zhuǎn)換為從 cpu 指令。

這意味著使用 JIT 后,Zend VM 不需要解釋某些操作碼,并且這些指令將直接作為 CPU 級(jí)指令執(zhí)行。

PHP 8 的 JIT

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

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

簡單一點(diǎn)來說 : 當(dāng) JIT 按預(yù)期工作時(shí),您的代碼不會(huì)通過 Zend VM 執(zhí)行,而是作為一組 CPU 級(jí)指令直接執(zhí)行。

這就是全部的想法。

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

PHP 的代碼是怎么執(zhí)行的?

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

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

解釋器的工作很簡單:接收 PHP 代碼,對(duì)其進(jìn)行解釋,然后返回結(jié)果。

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

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

  2. 拿到 Tokens 集合以后,PHP 解釋器將嘗試解析他們。通過稱之為 Parsing 的過程生成抽象語法樹(AST)。這里 AST 是一個(gè)節(jié)點(diǎn)集表示要執(zhí)行哪些操作。比如,「 echo 1 + 1 」實(shí)際含義是 「打印 1 + 1 的結(jié)果」 或者更詳細(xì)的說 「打印一個(gè)操作,這個(gè)操作是 1 + 1」。

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

  4. 有了 Opcodes ,有趣的部分就來了: executing 代碼! PHP 有一個(gè)稱為 Zend VM 的引擎,該引擎能夠接收一系列 Opcodes 并執(zhí)行它們。執(zhí)行所有 Opcodes 后, Zend VM 就會(huì)將該程序終止。

這個(gè)圖可以讓你更清楚:

了解一下PHP 8的 JIT 特性!

一個(gè)簡化版的 PHP 解釋流程概述。

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

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

Opcache 擴(kuò)展

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

它的作用是為 Opcodes 添加一個(gè)內(nèi)存共享緩存層。它的工作是從 AST 中提取新生成的 Opcodes 并緩存它們,以便執(zhí)行時(shí)

可以跳過 Lexing/Tokenizing 和 Parsing 步驟。

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

了解一下PHP 8的 JIT 特性!

PHP 使用 Opcache 的解釋流程。如果文件已經(jīng)被解析,則 PHP 會(huì)為其獲取緩存的 Opcodes ,而不是再次解析。

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

旁注: 這是超贊的 PHP 7.4 預(yù)加載功能 RFC ! 允許你告訴 PHP FPM 解析代碼庫,將其轉(zhuǎn)換為 Opcodes 并且在執(zhí)行之前就將其緩存。

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

Just In Time 編譯有什么效果?

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

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

Zend VM 是用 C 編寫的程序,充當(dāng) Opcodes 和 CPU 之間的一層。 JIT 在運(yùn)行時(shí)直接生成編譯后的代碼,因此 PHP 可以

跳過 Zend VM 并直接被 CPU 執(zhí)行。 從理論上說,性能會(huì)更好。

這聽起來很奇怪,因?yàn)樵诰幾g成機(jī)器碼之前,需要為每種類型的結(jié)構(gòu)體編寫一個(gè)具體的實(shí)現(xiàn)。但實(shí)際上這也是合理的。

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

但是,有一個(gè)問題困擾了我很久。

如果預(yù)加載能夠在執(zhí)行之前將 PHP 代碼解析為 Opcodes,并且 DynASM 可以將 Opcodes 編譯為機(jī)器碼 (Just In Time 編譯) ,為什么我們不立即使用運(yùn)行前編譯 (Ahead of Time 編譯) 立即編譯 PHP 呢?

通過收聽 Zeev 的廣播,我找到的原因之一就是 PHP 是弱類型語言,這意味著在 Zend VM 嘗試執(zhí)行某個(gè)操作碼之前, PHP 通常不知道變量的類型。

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

例如,這個(gè) Zend VM handler 是處理「小于或等于」(<=) 表達(dá)式。看看它編碼這么多的 if else 分支,只是為了類型推斷。

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

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

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

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

為了尋求平衡, PHP 的 JIT 嘗試只編譯有價(jià)值的 Opcodes 。為此, JIT 會(huì)分析 Zend VM 要執(zhí)行的 Opcodes 并檢查可能編譯的地方。(根據(jù)配置文件)

當(dāng)某個(gè) Opcode 編譯后,它將把執(zhí)行交給該編譯后的代碼,而不是交給 Zend VM 。看起來如下:

了解一下PHP 8的 JIT 特性!

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

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

有趣的是,由于當(dāng)前接口中編譯的代碼有 MB 的限制 (也是可配置的),所以代碼執(zhí)行必須能夠在 JIT 和解釋代碼之間無縫切換。

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

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

所以你的性能收益可能不會(huì)很大

我希望現(xiàn)在大家都很清楚為什么大多數(shù) php 應(yīng)用程序不會(huì)因?yàn)槭褂眉磿r(shí)編譯器而獲得很大的性能收益。這也是為什么 Zeev 建議為你的應(yīng)用程序分析和試驗(yàn)不同的 JIT 配置是最好的方法。

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

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

除非…

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

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

有趣的時(shí)光成為一個(gè) PHP 程序員…

相關(guān)教程推薦:《PHP教程》

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
欧美一区二区三区红桃小说| 欧美肉体裸交做爰XXXⅩ性| 蜜桃AV麻豆AV天美AV| 男人J放进女人P全黄动态图| 秋霞无码AⅤ一区二区三区| 草莓视频CAOMEI888| 大尺度一对一视频聊天软件| 国产精品国产精品偷麻豆| 黑人欧美一区二区三区4p| 久久久久国色AV免费观看| 女人18片毛片免费| 日韩免费无码成人久久久久久片| 无码熟熟妇丰满人妻啪啪软件 | 性欧美暴力猛交69HD| 亚洲精品国产欧美一二区| 中国丰满人妻VIDEOSHD| 波多野结衣在线观看AV| 国产精品视频色尤物YW| 精品综合久久久久久98| 女人和拘做受全过程| 色综合久久久无码中文字幕波多| 午夜无码一区二区三区在线观看| 亚洲中文字幕日产乱码高清APP| 4HC88四虎WWW在线影院| 风间由美性色一区二区三区| 护士交换粗吟配乱大交| 妺妺坐在我腿上勃起弄了应用 | 免费男人下部进女人下部视频| 日本黄色网址日本| 亚洲AV无码专区成人网址| 中国少妇无码专区| 福利姬国产精品一区在线| 黑人性狂欢在线播放| 内射无码专区久久亚洲| 久久久国产精华液| 人妻人人澡人人添人人爽人人玩 | 国产毛片一二区三区四区| 久久婷婷五月国产色综合| 日本久久久久久久久精品| 亚洲AV无码不卡| 99久久99久久免费精品蜜桃| 国产高清午夜人成在线观看| 久久九九兔免费精品6| 奇米影视7777狠狠狠狠影视| 亚洲AVSSS在线观看| 18禁爆乳无遮挡免费观看日本动| 国产高清在线a视频大全| 乱中年女人伦AV一区二区| 少妇极品熟妇人妻| 一边下奶一边吃面膜视频讲解| 成人免费无遮挡在线播放| 又色又爽又黄的视频APP软件下| 草莓视频在线播放视频| 精品国内在视频线2019| 青苹果影院YY04080看| 亚洲国产精品福利片在线观看| 啊轻点灬大JI巴太粗熟妇| 狠狠色欧美亚洲狠狠色WWW| 欧洲美熟女乱又伦AV曰曰| 亚洲VA天堂VA在线VA欧美| 波多野结衣在线观看AV| 久久99久国产麻精品66| 少妇又爽又刺激视频| 中国女人内射69XXXXⅩ视频| 国产日产欧产精品精品| 情人伊人久久综合亚洲| 亚洲人成无码网WWW电影麻豆| 高清VPSWINDOWS另类乱| 免费A级毛片在线播放| 亚洲AV无码精品无码麻豆| 差差差不多视频30分钟轮滑| 久久久久夜色精品国产明星| 天天躁夜夜躁AV天天爽| CHINESE勾搭VIDEOS| 精品乱码一区内射人妻无码| 少妇色欲av永久性精品爽妇| 97久久国产亚洲精品超碰热| 黑人男女粗大猛烈进出视频| 舌头伸进去添的我好爽高潮欧美 | 最新无码A∨在线观看| 国产熟女露脸大叫高潮| 日本真人无遮挡啪啪免费| 岳故意装睡让我挺进去的电影| 国产日韩亚洲大尺度高清| 人体艺术在线观看| 又硬又大又长又粗又深| 很黄很黄的曰批视频| 水多多凹凸福利视频导航| FRYEE性欧美18 19| 久久亚洲熟妇熟女ⅩXXXHD| 亚洲AV无码一区二区三区DV| 疯狂做受XXXⅩ高潮高潮按摩| 欧美精品人妻大乳一区二区| 野花日本免费完整版高清版8| 国产午夜成人AV在线播放| 色翁荡熄又大又硬又粗又视频 | 国产精品无码专区在线观看| 日本伊人色综合网| 99精品人妻少妇一区二区| 久久婷婷综合缴情亚洲狠狠_| 亚洲成AV人无码综合在线| 国产精品私密保养| 少妇AV一区二区三区无码久久| NARUTOMANGA无尽纲手| 男女车车的车车网站W98免费| 亚洲欧洲日产国码无码AV喷潮 | 亚洲成A人片在线观看无码3D| 国产精品天干天干在线观看澳门 | 亚洲欧美偷拍另类A∨色屁股| 国产小视频A在线观看| 无码熟妇人妻AV在线C0930| 丰满人妻被黑人猛烈进入| 日本VPSWINDOWS怀孕| HD老熟女BBN老淑女| 女人被躁到高潮嗷嗷叫小说百度| 与子敌伦刺激对白播放| 久久国产一区二区三区| 亚洲精品无码久久毛片波多野吉衣| 国产亚洲美女精品久久久| 香港三日本三级少妇三级视频| 国产成人无码AV在线影院| 熟妇女人妻丰满少妇中文字幕性生活| 成人AV无码一区二区三区| 人妻丰满熟妇av无码区HD优| AV无码中出一区二区三区| 欧美日韩免费观看| IGAO在线视频成人免费| 欧美无人区码卡二三卡四卡| AV无码人妻一区二区三区在线| 欧美极度另类XXⅩOO| JAPAN高清日本乱XXXXX| 欧美性XXXXX极品娇小| WWW.色五月.COM| 日本高清无卡码一区二区久久| 成年女人毛片免费视频喷潮| 色偷偷人人澡人人爽人人模| 国产AV人人夜夜澡人人爽麻豆| 天天躁夜夜躁很很躁| 国产激情久久久久影院蜜桃AV| 无码少妇xxxx| 狠狠色噜噜狠狠狠狠97俺也去| 亚洲乱码尤物193YW| 久久久久久亚洲AV成人无码国产| 曰韩亚洲AV人人夜夜澡人人爽| 麻花传媒网站永久入口视频| 99W乳液78W78W永久| 人妻少妇伦在线无码| 丰满少妇A级毛片野外| 天堂А√资源中文在线地址BT| 国产日韩AV在线播放| 亚洲国产精品成人无码区| 久久午夜私人影院| 99精品国产一区二区三区2| 人人插人人操人人射av网| 高清国产AV一区二区三区| 午夜免费无码福利视频| 精品久久久久久综合日本 | 妺妺窝人体色WWW聚色窝| А√天堂8资源最新版| 少妇人妻偷人精品视蜜桃| 国产乱子伦精品免费无码专区| 亚洲国产精品无码久久一线| 浪荡受NP纯肉公共场合BL男男| FREE性满足HD| 铜铜铜铜铜铜铜铜好大免费| 娇妻强被迫伦姧惨叫 在线| 又粗又大又爽又舒服日产| 欧洲无人区码SUV| 国产成人无码精品久久久免费| 亚洲白嫩学生AV无码一区| 满18岁夜里禁用100款APP| 成年轻人电影WWW无码| 性高朝久久久久久久3小时| 久久久久久A亚洲欧洲AV| CAOPORN超碰进入页面| 天堂国品一二三产品区别大吗| 精品动漫一区二区无遮挡| 最新国产精品久久精品| 少妇白浆高潮无码免费区 | 国产成人无码AV一区二区| 亚洲国产精品嫩草影院久久 | 我和大佬的365天| 久久精品女同亚洲女同| 啊灬啊灬啊灬快灬深用力| 小东西好几天没弄了还能吃吗 | 小受呻吟高潮GV在线观看| 久欠精品国国产99国产精2| 差差差无掩盖30分钟79集 | 少妇下蹲露大唇无遮挡| 精品人妻无码区二区三区密桃| CHINA浴室洗澡VOYEUR| 性生大片免费观看网站| 麻豆视频传媒入口| 国产成 人 在线观看 亚洲| 亚洲性夜夜综合久久7777| 日本XXXX色视频在线观看免费| 国内偷窥一区二区三区视频| 99久久国产自偷自偷免费一区 | 我被八个男人玩到早上| 麻豆国产VA免费精品高清在线|