国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript工作原理(六):WebAssembly比較分析和特定情況下最好在JavaScri

novo / 758人閱讀

摘要:我們將拆分來分析它的工作原理,更重要的是,它在性能方面如何提升加載時間,執行速度,垃圾回收,內存使用率,平臺訪問,調試,多線程和可移植性。目前,是圍繞和用例設計的。多線程在單個線程上運行。目前不支持多線程。被設計為安全和便攜。

我們將拆分WebAssembly來分析它的工作原理,更重要的是,它在性能方面如何提升JavaScript:加載時間,執行速度,垃圾回收,內存使用率,平臺API訪問,調試,多線程和可移植性。

我們構建Web應用程序的方式正處于革命的邊緣 - 這仍然是初期階段,但我們對Web應用程序的看法正在發生變化。

首先,讓我們看看WebAssembly的功能

WebAssembly(又名wasm)是一種高效的,低級的網絡字節碼。

WASM使您能夠使用JavaScript以外的語言(例如C,C ++,Rust或其他),在其中編寫程序,然后將其編譯(提前)到WebAssembly。

其結果是一個加載和執行速度非常快的Web應用程序。

加載時間

為了加載JavaScript,瀏覽器必須加載所有文本的.js文件。

WebAssembly在瀏覽器中加載速度更快,因為只有已編譯的wasm文件必須通過互聯網傳輸。而wasm是一種非常簡潔的二進制格式的低級匯編語言。

執行

今天Wasm比本地代碼執行速度慢20%。無論如何,這是一個驚人的結果。它是一種編譯到沙箱環境中的格式,并且在很多約束條件下運行,以確保它沒有安全漏洞,或者對它們非常強硬。與真正的本地代碼相比,速度下降很小。更重要的是,未來它會更快。

更好的是,它與瀏覽器無關 - 所有主要引擎都增加了對WebAssembly的支持,并且現在提供類似的執行時間。

為了理解WebAssembly與JavaScript相比執行得有多快,您應該先閱讀我們關于JavaScript引擎如何工作的文章。

我們來看看V8中會發生什么樣的快速概述:

在左側,我們有一些JavaScript源代碼,包含JavaScript函數。它首先需要進行分析,以便將所有字符串轉換為標記并生成抽象語法樹(AST)。AST是JavaScript程序邏輯的內存表示。一旦生成這種表示,V8直接轉到機器碼。基本上遍歷樹,生成機器代碼,生成你的編譯后的函數。 沒有真正的嘗試來加速它。

現在,我們來看看V8管道在下一階段的功能:

這次我們有TurboFan,V8的優化編譯器之一。當您的JavaScript應用程序正在運行時,很多代碼在V8中運行。TurboFan可以監控某些內容是否運行緩慢,是否存在瓶頸和熱點以優化它們。它將它們推送到后端,這是一個優化的JIT,它為那些耗時耗力CPU的函數創建了更快的代碼。

它解決了這個問題,但這里的問題在于,分析代碼并決定優化哪些內容的過程也會消耗CPU。 這反過來又意味著更高的電池消耗,特別是在移動設備上。

那么,wasm并不需要所有這些 - 它會被插入工作流程中,如下所示:

在匯編階段,wasm已經通過優化。最重要的是,解析也不是必需的。你有一個優化的二進制文件,可以直接掛接到可以生成機器碼的后端。 所有優化都由編譯器在前端完成。

這使得執行wasm更有效率,因為流程中的很多步驟都可以簡單地跳過。

內存模型

例如,編譯成WebAssembly的C++程序的內存是連續的內存塊,其中沒有“洞”。有助于提高安全性的wasm的特性之一是執行堆棧與線性內存分離的概念。在一個C++程序中,你有一堆,你從堆的底部分配,然后從堆頂部開始堆棧。可以帶一個指針,然后在堆棧內存中查找,以便玩弄你不應該觸摸的變量。

這是很多惡意軟件利用的陷阱。

WebAssembly采用完全不同的模型。執行堆棧與WebAssembly程序本身是分開的,因此您無法在其中修改并更改變量等內容。而且,這些函數使用整數偏移而不是指針。函數指向一個間接函數表。然后這些直接計算的數字跳轉到模塊內部的函數中。它是以這種方式構建的,以便您可以并排加載多個wasm模塊,并抵消所有索引,并且一切正常。

有關JavaScript中內存模型和管理的更多信息,可以查看關于該主題的非常詳細的帖子。

垃圾收集

您已經知道JavaScript的內存管理是使用垃圾收集器處理的。

WebAssembly的情況有點不同。它支持手動管理內存的語言。您可以將自己的GC與您的wasm模塊一起發貨,但這是一項復雜的任務。

目前,WebAssembly是圍繞C++和RUST用例設計的。由于wasm是非常低級的,因此編程語言只是匯編語言之上的一個步驟就很容易編譯。 C可以使用普通的malloc,C++可以使用智能指針,Rust使用完全不同的范例(完全不同的主題)。這些語言不使用GC,因此它們不需要所有復雜的運行時間內容來跟蹤內存。 WebAssembly對他們來說是天作之合。

另外,這些語言并不是100%設計用于調用DOM等復雜的JavaScript事物。在C++中編寫整個HTML應用程序是沒有意義的,因為C++不是為它設計的。在大多數情況下,當工程師編寫C++或Rust時,他們的目標是WebGL或高度優化的庫(例如繁重的數學計算)。

但是,將來WebAssembly將支持不附帶GC的語言。

平臺API訪問

取決于執行JavaScript的運行時,訪問特定于平臺的API將被公開,可通過JavaScript應用程序直接訪問。例如,如果您在瀏覽器中運行JavaScript,則您有一組Web API,Web應用程序可以調用它來控制Web瀏覽器/設備功能并訪問DOM,CSSOM,WebGL,IndexedDB,Web Audio API等。

那么,WebAssembly模塊無法訪問任何平臺API。一切都是由JavaScript調解的。如果您想訪問WebAssembly模塊中的某些平臺特定的API,則必須通過JavaScript調用它。

例如,如果您想使用console.log,則必須通過JavaScript調用它,而不是使用C ++代碼。這些JavaScript調用的成本有所降低。

這并不總是如此。該規范將在未來為平臺API提供wasm,并且您將能夠在沒有JavaScript的情況下發布您的應用程序。

源地圖

當您壓縮JavaScript代碼時,您需要一種正確調試它的方法。這就是Source Maps來拯救的地方。
基本上,源地圖是一種將組合/縮小文件映射回未建立狀態的方法。當您為生產而構建時,同時縮小和組合您的JavaScript文件,您將生成一個包含原始文件信息的源映射。當您在生成的JavaScript中查詢某一行和列號時,可以在返回原始位置的源地圖中執行查找。

WebAssembly目前不支持源地圖,因為沒有規范,但最終(可能很快)。

當您在C++代碼中設置斷點時,您將看到C++代碼而不是WebAssembly。至少,這是目標。

多線程

JavaScript在單個線程上運行。有很多方法可以利用Event Loop并利用異步編程,如我們關于該主題的文章中詳細介紹的那樣。

JavaScript也使用Web Workers,但他們有一個非常具體的用例 - 基本上,任何激烈的CPU計算會阻止主UI線程,把他們放到Web Worker中將會受益。但是,Web Workers無法訪問DOM。

WebAssembly目前不支持多線程。但是,這可能是未來的事情。 Wasm將接近本地線程(例如C++樣式線程)。擁有“真實”的線程將在瀏覽器中創造出許多新的機會。當然,這將打開更多濫用可能性的大門。

可移植性

如今,JavaScript幾乎可以在任何地方運行,從瀏覽器到服務器端甚至嵌入式系統。

WebAssembly被設計為安全和便攜。就像JavaScript一樣。 它將運行在支持主機的每個環境中(例如每個瀏覽器)。

WebAssembly具有與Java初期嘗試實現的Appliets相同的目標

在JavaScript上使用WebAssembly哪里更好?

在WebAssembly的第一個版本中,主要關注CPU占用大的計算(例如處理數學)。想到的最主流的用途是游戲 - 那里有大量的像素操作。您可以使用您習慣的OpenGL綁定在C ++ / Rust中編寫您的應用程序,并將其編譯為wasm。它會在瀏覽器中運行。

看看這個(在Firefox中運行) - http://s3.amazonaws.com/mozil...。這是運行虛幻引擎。

另一種使用WebAssembly(性能方面)可能有意義的情況是實現一些庫,這是一個CPU密集型工作。例如,一些圖像處理。

如前所述,由于大多數處理步驟在編譯期間已提前完成,因此可以減少移動設備上的電池消耗(取決于引擎)。

將來,即使您實際上沒有編寫編譯代碼,您也可以使用WASM二進制文件。您可以在NPM中找到開始使用此方法的項目。

對于DOM操作和沉重的平臺API使用,使用JavaScript確實很有意義,因為它不會增加額外開銷,并且API本身提供。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/107746.html

相關文章

  • WebAssembly 系列(四)WebAssembly 工作原理

    摘要:但是它們其實并不是二選一的關系并不是只能用或者。正因為如此,指令有時也被稱為虛擬指令。這是因為是采用基于棧的虛擬機的機制。聲明模塊的全局變量。。下文預告現在你已經了解了模塊的工作原理,下面將會介紹為什么運行的更快。 作者:Lin Clark 編譯:胡子大哈 翻譯原文:http://huziketang.com/blog/posts/detail?postId=58c77641a6d8...

    stormzhang 評論0 收藏0
  • WebAssembly 那些事兒

    摘要:的目標是對高級程序中間表示的適當低級抽象,即代碼旨在由編譯器生成而不是由人來寫。表示把源代碼變成解釋器可以運行的代碼所花的時間表示基線編譯器和優化編 WebAssembly 那些事兒 什么是 WebAssembly? WebAssembly 是除 JavaScript 以外,另一種可以在網頁中運行的編程語言,并且相比之下在某些功能和性能問題上更具優勢,過去我們想在瀏覽器中運行代碼來對網...

    邱勇 評論0 收藏0
  • JavaScript 工作原理WebAssembly 對比 JavaScript 及其使用場景

    摘要:現在,我們將會剖析的工作原理,而最重要的是它和在性能方面的比對加載時間,執行速度,垃圾回收,內存使用,平臺訪問,調試,多線程以及可移植性。目前,是專門圍繞和的使用場景設計的。目前不支持多線程。 原文請查閱這里,略有改動,本文采用知識共享署名 4.0 國際許可協議共享,BY Troland。 本系列持續更新中,Github 地址請查閱這里。 這是 JavaScript 工作原理的第六章...

    jay_tian 評論0 收藏0
  • WebAssembly 為什么比 asm.js 快?

    摘要:并且于年月日,四個主要的瀏覽器一致同意宣布的版本已經完成,即將推出一個瀏覽器可以搭載的穩定版本。因此本文著重介紹為什么比更快。本文主要表達的是為什么應該是更快的。則不同,它是由幾大主要的瀏覽器廠商共同設計的。 作者:Alon Zakai 編譯:胡子大哈 翻譯原文:http://huziketang.com/blog/posts/detail?postId=58ce80d2a6d8a0...

    Binguner 評論0 收藏0

發表評論

0條評論

novo

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<