摘要:我們將拆分來(lái)分析它的工作原理,更重要的是,它在性能方面如何提升加載時(shí)間,執(zhí)行速度,垃圾回收,內(nèi)存使用率,平臺(tái)訪問,調(diào)試,多線程和可移植性。目前,是圍繞和用例設(shè)計(jì)的。多線程在單個(gè)線程上運(yùn)行。目前不支持多線程。被設(shè)計(jì)為安全和便攜。
我們將拆分WebAssembly來(lái)分析它的工作原理,更重要的是,它在性能方面如何提升JavaScript:加載時(shí)間,執(zhí)行速度,垃圾回收,內(nèi)存使用率,平臺(tái)API訪問,調(diào)試,多線程和可移植性。
我們構(gòu)建Web應(yīng)用程序的方式正處于革命的邊緣 - 這仍然是初期階段,但我們對(duì)Web應(yīng)用程序的看法正在發(fā)生變化。
首先,讓我們看看WebAssembly的功能WebAssembly(又名wasm)是一種高效的,低級(jí)的網(wǎng)絡(luò)字節(jié)碼。
WASM使您能夠使用JavaScript以外的語(yǔ)言(例如C,C ++,Rust或其他),在其中編寫程序,然后將其編譯(提前)到WebAssembly。
其結(jié)果是一個(gè)加載和執(zhí)行速度非常快的Web應(yīng)用程序。
加載時(shí)間為了加載JavaScript,瀏覽器必須加載所有文本的.js文件。
WebAssembly在瀏覽器中加載速度更快,因?yàn)橹挥幸丫幾g的wasm文件必須通過互聯(lián)網(wǎng)傳輸。而wasm是一種非常簡(jiǎn)潔的二進(jìn)制格式的低級(jí)匯編語(yǔ)言。
執(zhí)行今天Wasm比本地代碼執(zhí)行速度慢20%。無(wú)論如何,這是一個(gè)驚人的結(jié)果。它是一種編譯到沙箱環(huán)境中的格式,并且在很多約束條件下運(yùn)行,以確保它沒有安全漏洞,或者對(duì)它們非常強(qiáng)硬。與真正的本地代碼相比,速度下降很小。更重要的是,未來(lái)它會(huì)更快。
更好的是,它與瀏覽器無(wú)關(guān) - 所有主要引擎都增加了對(duì)WebAssembly的支持,并且現(xiàn)在提供類似的執(zhí)行時(shí)間。
為了理解WebAssembly與JavaScript相比執(zhí)行得有多快,您應(yīng)該先閱讀我們關(guān)于JavaScript引擎如何工作的文章。
我們來(lái)看看V8中會(huì)發(fā)生什么樣的快速概述:
在左側(cè),我們有一些JavaScript源代碼,包含JavaScript函數(shù)。它首先需要進(jìn)行分析,以便將所有字符串轉(zhuǎn)換為標(biāo)記并生成抽象語(yǔ)法樹(AST)。AST是JavaScript程序邏輯的內(nèi)存表示。一旦生成這種表示,V8直接轉(zhuǎn)到機(jī)器碼?;旧媳闅v樹,生成機(jī)器代碼,生成你的編譯后的函數(shù)。 沒有真正的嘗試來(lái)加速它。
現(xiàn)在,我們來(lái)看看V8管道在下一階段的功能:
這次我們有TurboFan,V8的優(yōu)化編譯器之一。當(dāng)您的JavaScript應(yīng)用程序正在運(yùn)行時(shí),很多代碼在V8中運(yùn)行。TurboFan可以監(jiān)控某些內(nèi)容是否運(yùn)行緩慢,是否存在瓶頸和熱點(diǎn)以優(yōu)化它們。它將它們推送到后端,這是一個(gè)優(yōu)化的JIT,它為那些耗時(shí)耗力CPU的函數(shù)創(chuàng)建了更快的代碼。
它解決了這個(gè)問題,但這里的問題在于,分析代碼并決定優(yōu)化哪些內(nèi)容的過程也會(huì)消耗CPU。 這反過來(lái)又意味著更高的電池消耗,特別是在移動(dòng)設(shè)備上。
那么,wasm并不需要所有這些 - 它會(huì)被插入工作流程中,如下所示:
在匯編階段,wasm已經(jīng)通過優(yōu)化。最重要的是,解析也不是必需的。你有一個(gè)優(yōu)化的二進(jìn)制文件,可以直接掛接到可以生成機(jī)器碼的后端。 所有優(yōu)化都由編譯器在前端完成。
這使得執(zhí)行wasm更有效率,因?yàn)榱鞒讨械暮芏嗖襟E都可以簡(jiǎn)單地跳過。
內(nèi)存模型例如,編譯成WebAssembly的C++程序的內(nèi)存是連續(xù)的內(nèi)存塊,其中沒有“洞”。有助于提高安全性的wasm的特性之一是執(zhí)行堆棧與線性內(nèi)存分離的概念。在一個(gè)C++程序中,你有一堆,你從堆的底部分配,然后從堆頂部開始堆棧。可以帶一個(gè)指針,然后在堆棧內(nèi)存中查找,以便玩弄你不應(yīng)該觸摸的變量。
這是很多惡意軟件利用的陷阱。
WebAssembly采用完全不同的模型。執(zhí)行堆棧與WebAssembly程序本身是分開的,因此您無(wú)法在其中修改并更改變量等內(nèi)容。而且,這些函數(shù)使用整數(shù)偏移而不是指針。函數(shù)指向一個(gè)間接函數(shù)表。然后這些直接計(jì)算的數(shù)字跳轉(zhuǎn)到模塊內(nèi)部的函數(shù)中。它是以這種方式構(gòu)建的,以便您可以并排加載多個(gè)wasm模塊,并抵消所有索引,并且一切正常。
有關(guān)JavaScript中內(nèi)存模型和管理的更多信息,可以查看關(guān)于該主題的非常詳細(xì)的帖子。
垃圾收集您已經(jīng)知道JavaScript的內(nèi)存管理是使用垃圾收集器處理的。
WebAssembly的情況有點(diǎn)不同。它支持手動(dòng)管理內(nèi)存的語(yǔ)言。您可以將自己的GC與您的wasm模塊一起發(fā)貨,但這是一項(xiàng)復(fù)雜的任務(wù)。
目前,WebAssembly是圍繞C++和RUST用例設(shè)計(jì)的。由于wasm是非常低級(jí)的,因此編程語(yǔ)言只是匯編語(yǔ)言之上的一個(gè)步驟就很容易編譯。 C可以使用普通的malloc,C++可以使用智能指針,Rust使用完全不同的范例(完全不同的主題)。這些語(yǔ)言不使用GC,因此它們不需要所有復(fù)雜的運(yùn)行時(shí)間內(nèi)容來(lái)跟蹤內(nèi)存。 WebAssembly對(duì)他們來(lái)說(shuō)是天作之合。
另外,這些語(yǔ)言并不是100%設(shè)計(jì)用于調(diào)用DOM等復(fù)雜的JavaScript事物。在C++中編寫整個(gè)HTML應(yīng)用程序是沒有意義的,因?yàn)镃++不是為它設(shè)計(jì)的。在大多數(shù)情況下,當(dāng)工程師編寫C++或Rust時(shí),他們的目標(biāo)是WebGL或高度優(yōu)化的庫(kù)(例如繁重的數(shù)學(xué)計(jì)算)。
但是,將來(lái)WebAssembly將支持不附帶GC的語(yǔ)言。
平臺(tái)API訪問取決于執(zhí)行JavaScript的運(yùn)行時(shí),訪問特定于平臺(tái)的API將被公開,可通過JavaScript應(yīng)用程序直接訪問。例如,如果您在瀏覽器中運(yùn)行JavaScript,則您有一組Web API,Web應(yīng)用程序可以調(diào)用它來(lái)控制Web瀏覽器/設(shè)備功能并訪問DOM,CSSOM,WebGL,IndexedDB,Web Audio API等。
那么,WebAssembly模塊無(wú)法訪問任何平臺(tái)API。一切都是由JavaScript調(diào)解的。如果您想訪問WebAssembly模塊中的某些平臺(tái)特定的API,則必須通過JavaScript調(diào)用它。
例如,如果您想使用console.log,則必須通過JavaScript調(diào)用它,而不是使用C ++代碼。這些JavaScript調(diào)用的成本有所降低。
這并不總是如此。該規(guī)范將在未來(lái)為平臺(tái)API提供wasm,并且您將能夠在沒有JavaScript的情況下發(fā)布您的應(yīng)用程序。
源地圖當(dāng)您壓縮JavaScript代碼時(shí),您需要一種正確調(diào)試它的方法。這就是Source Maps來(lái)拯救的地方。
基本上,源地圖是一種將組合/縮小文件映射回未建立狀態(tài)的方法。當(dāng)您為生產(chǎn)而構(gòu)建時(shí),同時(shí)縮小和組合您的JavaScript文件,您將生成一個(gè)包含原始文件信息的源映射。當(dāng)您在生成的JavaScript中查詢某一行和列號(hào)時(shí),可以在返回原始位置的源地圖中執(zhí)行查找。
WebAssembly目前不支持源地圖,因?yàn)闆]有規(guī)范,但最終(可能很快)。
當(dāng)您在C++代碼中設(shè)置斷點(diǎn)時(shí),您將看到C++代碼而不是WebAssembly。至少,這是目標(biāo)。
多線程JavaScript在單個(gè)線程上運(yùn)行。有很多方法可以利用Event Loop并利用異步編程,如我們關(guān)于該主題的文章中詳細(xì)介紹的那樣。
JavaScript也使用Web Workers,但他們有一個(gè)非常具體的用例 - 基本上,任何激烈的CPU計(jì)算會(huì)阻止主UI線程,把他們放到Web Worker中將會(huì)受益。但是,Web Workers無(wú)法訪問DOM。
WebAssembly目前不支持多線程。但是,這可能是未來(lái)的事情。 Wasm將接近本地線程(例如C++樣式線程)。擁有“真實(shí)”的線程將在瀏覽器中創(chuàng)造出許多新的機(jī)會(huì)。當(dāng)然,這將打開更多濫用可能性的大門。
可移植性如今,JavaScript幾乎可以在任何地方運(yùn)行,從瀏覽器到服務(wù)器端甚至嵌入式系統(tǒng)。
WebAssembly被設(shè)計(jì)為安全和便攜。就像JavaScript一樣。 它將運(yùn)行在支持主機(jī)的每個(gè)環(huán)境中(例如每個(gè)瀏覽器)。
WebAssembly具有與Java初期嘗試實(shí)現(xiàn)的Appliets相同的目標(biāo)
在JavaScript上使用WebAssembly哪里更好?在WebAssembly的第一個(gè)版本中,主要關(guān)注CPU占用大的計(jì)算(例如處理數(shù)學(xué))。想到的最主流的用途是游戲 - 那里有大量的像素操作。您可以使用您習(xí)慣的OpenGL綁定在C ++ / Rust中編寫您的應(yīng)用程序,并將其編譯為wasm。它會(huì)在瀏覽器中運(yùn)行。
看看這個(gè)(在Firefox中運(yùn)行) - http://s3.amazonaws.com/mozil...。這是運(yùn)行虛幻引擎。
另一種使用WebAssembly(性能方面)可能有意義的情況是實(shí)現(xiàn)一些庫(kù),這是一個(gè)CPU密集型工作。例如,一些圖像處理。
如前所述,由于大多數(shù)處理步驟在編譯期間已提前完成,因此可以減少移動(dòng)設(shè)備上的電池消耗(取決于引擎)。
將來(lái),即使您實(shí)際上沒有編寫編譯代碼,您也可以使用WASM二進(jìn)制文件。您可以在NPM中找到開始使用此方法的項(xiàng)目。
對(duì)于DOM操作和沉重的平臺(tái)API使用,使用JavaScript確實(shí)很有意義,因?yàn)樗粫?huì)增加額外開銷,并且API本身提供。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/107746.html
摘要:但是它們其實(shí)并不是二選一的關(guān)系并不是只能用或者。正因?yàn)槿绱?,指令有時(shí)也被稱為虛擬指令。這是因?yàn)槭遣捎没跅5奶摂M機(jī)的機(jī)制。聲明模塊的全局變量。。下文預(yù)告現(xiàn)在你已經(jīng)了解了模塊的工作原理,下面將會(huì)介紹為什么運(yùn)行的更快。 作者:Lin Clark 編譯:胡子大哈 翻譯原文:http://huziketang.com/blog/posts/detail?postId=58c77641a6d8...
摘要:的目標(biāo)是對(duì)高級(jí)程序中間表示的適當(dāng)?shù)图?jí)抽象,即代碼旨在由編譯器生成而不是由人來(lái)寫。表示把源代碼變成解釋器可以運(yùn)行的代碼所花的時(shí)間表示基線編譯器和優(yōu)化編 WebAssembly 那些事兒 什么是 WebAssembly? WebAssembly 是除 JavaScript 以外,另一種可以在網(wǎng)頁(yè)中運(yùn)行的編程語(yǔ)言,并且相比之下在某些功能和性能問題上更具優(yōu)勢(shì),過去我們想在瀏覽器中運(yùn)行代碼來(lái)對(duì)網(wǎng)...
摘要:現(xiàn)在,我們將會(huì)剖析的工作原理,而最重要的是它和在性能方面的比對(duì)加載時(shí)間,執(zhí)行速度,垃圾回收,內(nèi)存使用,平臺(tái)訪問,調(diào)試,多線程以及可移植性。目前,是專門圍繞和的使用場(chǎng)景設(shè)計(jì)的。目前不支持多線程。 原文請(qǐng)查閱這里,略有改動(dòng),本文采用知識(shí)共享署名 4.0 國(guó)際許可協(xié)議共享,BY Troland。 本系列持續(xù)更新中,Github 地址請(qǐng)查閱這里。 這是 JavaScript 工作原理的第六章...
摘要:并且于年月日,四個(gè)主要的瀏覽器一致同意宣布的版本已經(jīng)完成,即將推出一個(gè)瀏覽器可以搭載的穩(wěn)定版本。因此本文著重介紹為什么比更快。本文主要表達(dá)的是為什么應(yīng)該是更快的。則不同,它是由幾大主要的瀏覽器廠商共同設(shè)計(jì)的。 作者:Alon Zakai 編譯:胡子大哈 翻譯原文:http://huziketang.com/blog/posts/detail?postId=58ce80d2a6d8a0...
閱讀 3493·2021-10-08 10:15
閱讀 6246·2021-09-23 11:56
閱讀 1526·2019-08-30 15:55
閱讀 526·2019-08-29 16:05
閱讀 2786·2019-08-29 12:34
閱讀 2095·2019-08-29 12:18
閱讀 967·2019-08-26 12:02
閱讀 1713·2019-08-26 12:00