成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

WebAssembly 為什么比 asm.js 快?

Binguner / 2755人閱讀

摘要:并且于年月日,四個主要的瀏覽器一致同意宣布的版本已經(jīng)完成,即將推出一個瀏覽器可以搭載的穩(wěn)定版本。因此本文著重介紹為什么比更快。本文主要表達(dá)的是為什么應(yīng)該是更快的。則不同,它是由幾大主要的瀏覽器廠商共同設(shè)計的。

作者:Alon Zakai

編譯:胡子大哈

翻譯原文:http://huziketang.com/blog/posts/detail?postId=58ce80d2a6d8a07e449fdd28

英文原文:Why WebAssembly is Faster Than asm.js

轉(zhuǎn)載請注明出處,保留原文鏈接以及作者信息

本文作者:Alon Zakai

英文連接:Why WebAssembly is Faster Than asm.js

WebAssembly 是為 Web 而設(shè)計的、可以生成瀏覽器可執(zhí)行的二進(jìn)制文件的編程語言。并且于2017 年 2 月 28 日,四個主要的瀏覽器一致同意宣布 WebAssembly 的 MVP 版本已經(jīng)完成,即將推出一個瀏覽器可以搭載的穩(wěn)定版本。WebAssembly 的一個主要目標(biāo)就是變。本文將給出一些它如何變快的技術(shù)細(xì)節(jié)。

當(dāng)然,“快”是相對的概念。相比于 JavaScript 和其他動態(tài)語言,WebAssembly 的快主要是因為它的靜態(tài)類型特性和方便優(yōu)化特性。WebAssembly 意在速度上能夠達(dá)到和本地執(zhí)行一樣快,其實 asm.js 已經(jīng)比較接近這一目標(biāo)了,但是 WebAssembly 要進(jìn)一步縮短和本地執(zhí)行速度之間的差距。因此本文著重介紹為什么 WebAssembly 比 asm.js 更快。

在開始介紹之前,先做一些說明:新的技術(shù)總是有一些還沒來得及優(yōu)化的情況,所以目前來說,并不是所有情況下 WebAssembly 都是最快的。本文主要表達(dá)的是 WebAssembly 為什么應(yīng)該是更快的。對于它還不是那么快的一些情況,也是未來需要 fix 的問題。

那么有了這些標(biāo)準(zhǔn)以后,我們來介紹為什么 WebAssembly 更快。

1. 啟動

WebAssembly 設(shè)計之初就定位在:體積更小、下載更快、解析更快,這樣即使應(yīng)用于一個大型的 web 應(yīng)用上啟動也會很快。

JavaScript 代碼通過 gzip 進(jìn)行壓縮,與本地代碼相比它已經(jīng)壓縮了很多,想要進(jìn)一步縮小它的體積確實不是一件容易的事情。但是通過對 WebAssembly 文件大小的精心設(shè)計(LEB128 指標(biāo)),二進(jìn)制格式的 WebAssembly 的文件大小要比壓縮后的 JavaScript 文件更小。通常來講,要比 gzip 壓縮后的小 10% - 20%。

WebAssembly 在解析過程有更大的進(jìn)步:它的解析速度要比 JavaScript 快一個數(shù)量級。這得益于 WebAssembly 的二進(jìn)制格式就是為更適合解析而設(shè)計的。同時 WebAssembly 的解析和優(yōu)化函數(shù)也更容易實現(xiàn)并行,這一特點(diǎn)在多核機(jī)器上的體現(xiàn)更好。

影響啟動時間的因素除了下載和解析以外還有很多,比如代碼的 VM 完全優(yōu)化、執(zhí)行之前下載所必須的額外文件等。但是下載和解析步驟是無論如何都不可避免的步驟,因此要盡可能地對它們進(jìn)行優(yōu)化。不論是對于瀏覽器還是 app,其他的影響因素都有辦法避免或者緩和它們的影響(例如代碼的完全優(yōu)化,可以通過 WebAssembly 的基線編譯器或解釋器來避免)。

2. CPU 特性

使得 asm.js 這么快的技巧之一是利用好 CPU 特性。JavaScript 數(shù)字類型都是 double 型的,在 asm.js 中加法操作后會有一個按位與的操作,這使得 double 加法這個操作,在邏輯上和 CPU 做簡單的 int 加法(CPU 做簡單 int 加操作很快)是等價的。而 asm.js 巧妙地通過這種方式使得 VM 可以更加有效地利用 CPU。

但是有一些 JavaScript 中表達(dá)的東西,asm.js 是表達(dá)不了的。
WebAssembly 則不受 JavaScript 的約束,我們一起來看一下更多的可利用的 CPU 特性:

64 位整型?;?64 位整型的操作速度可以快 4 倍。例如可以增加哈希算法和加密算法的速度。

加載和存儲偏移量。它的用處特別廣泛,基本上所有包含域的內(nèi)存對象都涉及到偏移量的問題(如 C 語言中 struct 等)。

非對齊加載和存儲。這避免了 asm.js 所需要的 mask(asm.js 為 Typed Array 兼容而做的操作),同時這在幾乎所有的加載和存儲問題都用得上。

多種 CPU 指令,例如 popcount,copysign 等。每一個指令都有助于某種具體使用場景(例如,popcount 在密碼分析這個場景下很有用)。

在每一種具體場景下到底能起到多大作用,要依賴于如何使用上面提到的特性。和正常使用 asm.js 相比,我們的統(tǒng)計是大概比 asm.js 提升了 5% 的速率。未來還有更多可挖掘的 CPU 特性來提高速率,例如 SIMD。

3. 工具鏈改進(jìn)

WebAssembly 是編譯器生成的主要目標(biāo),所以它的運(yùn)行主要包含兩個部分:生成它的編譯器(工具鏈端)和運(yùn)行它的虛擬機(jī)(瀏覽器端)。優(yōu)良的性能全都依賴于這兩部分。

對于 asm.js,情況也類似,并且 Emscripten 做了一系列對工具鏈的優(yōu)化,還做了運(yùn)行 LLVM 的優(yōu)化器和 Emscripten 的 asm.js 優(yōu)化器。對 WebAssembly 的優(yōu)化都是在這些的基礎(chǔ)上來設(shè)計的,并且同時還加入了一些專門針對 WebAssembly 的改進(jìn)。我們自己在學(xué)習(xí) asm.js 的過程對我們改善 WebAssembly 很有幫助,尤其體現(xiàn)在一下幾個方面:

我們使用 Binaryen WebAssembly 優(yōu)化器來代替 Emscripten asm.js 優(yōu)化器,前者是專門為速度而設(shè)計,其速度的提升是以更多優(yōu)化步驟為代價的。例如在優(yōu)化的過程中會移除重復(fù)函數(shù),這樣會使 C++ 編譯代碼整體減小 5% 左右。

對冗余、復(fù)雜的控制流進(jìn)行更好的優(yōu)化,這可以提升 Relooper 算法的效率,對于編譯解釋類型循環(huán)也很有幫助。

Binaryen 優(yōu)化器是在試驗中不斷設(shè)計和完善的,通過超級優(yōu)化器做的實驗也會帶來各種情況的微妙改進(jìn)——我想 asm.js 也做過同樣的事情。

總的來說,這些工具鏈的改進(jìn),在 asm.js 的基礎(chǔ)上進(jìn)一步提升了 WebAssembly 的速度(Box2D 速度評測中,WebAssembly 的速度分別提升了 5% 和 7%)。

可預(yù)見的優(yōu)良性能

asm.js 的速度很接近本地執(zhí)行的速度了,但是它不可能在所有的瀏覽器中都達(dá)到同樣的標(biāo)準(zhǔn)。因為在使用 asm.js 的過程中,一些人嘗試用一種方法來優(yōu)化 asm.js,而另一些人用另一種方法優(yōu)化,這導(dǎo)致了不同人有不同的版本和結(jié)果。雖然隨著時間的推移,大家對于 asm.js 也達(dá)成了某種共識,但是對于 asm.js 來講,本質(zhì)問題是它還是沒有一個統(tǒng)一的標(biāo)準(zhǔn)。它只是一個由一個廠商推出的,非標(biāo)準(zhǔn)的 JavaScript 子集而已,而它的使用者根據(jù)自己的偏好和習(xí)慣來使用它。

WebAssembly 則不同,它是由幾大主要的瀏覽器廠商共同設(shè)計的。與 JavaScript相比,JavaScript 只能通過一些創(chuàng)新方法或者 asm.js 這種方法來提高速度,而不論哪種方法都不可能適用于所有瀏覽器。WebAssembly 的優(yōu)化方案則得到了大多數(shù)廠商的認(rèn)可。對于 WebAssembly 來講,對于不同的 VM 依舊有很大的提升空間(如 AOT、JIT 有不同編譯方式)。不過能夠基本斷定的是,可以應(yīng)用于整個網(wǎng)絡(luò)的優(yōu)良性能是指日可期的。

想了解更多關(guān)于 WebAssembly 的知識,請移步下面 WebAssembly 系列文章。

背景知識:

WebAssembly 系列(一)生動形象地介紹 WebAssembly

WebAssembly 系列(二)JavaScript Just-in-time (JIT) 工作原理

WebAssembly 系列(三)編譯器如何生成匯編

當(dāng)前 WebAssembly 的狀況

WebAssembly 系列(四)WebAssembly 工作原理

WebAssembly 系列(五)為什么 WebAssembly 更快?

WebAssembly 的未來

WebAssembly 系列(六)WebAssembly 的現(xiàn)在與未來

轉(zhuǎn)載請注明出處,保留原文鏈接以及作者信息

歡迎大家關(guān)注我的前端大哈 - 知乎專欄,定期發(fā)布高質(zhì)量前端文章。

我最近正在寫一本《React.js 小書》,對 React.js 感興趣的童鞋,歡迎指點(diǎn)。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/82129.html

相關(guān)文章

  • 【譯】WebAssembly 初嘗

    摘要:在當(dāng)前階段,僅僅只是字節(jié)碼規(guī)范。如果都沒有將代碼編譯為字節(jié)碼的工具,要起步就很困難了。接下來要做的是使用將格式的代碼轉(zhuǎn)換為二進(jìn)制碼。運(yùn)行文件,最后就能得到瀏覽器需要的真正的二進(jìn)制碼。 本文轉(zhuǎn)載自:眾成翻譯譯者:文藺鏈接:http://www.zcfy.cc/article/1031原文:http://cultureofdevelopment.com/blog/build-your-fi...

    anonymoussf 評論0 收藏0
  • WebAssembly 系列(六)WebAssembly 的現(xiàn)在與未來

    摘要:目前正在開發(fā)兩個編譯器系統(tǒng)。這就意味著有很多功能還在襁褓之中,沒有經(jīng)過徹底思考以及實際驗證。這些特性叫做未來特性。實現(xiàn)這一功能將會使用中的,而這一功能的實現(xiàn)將會提高程序執(zhí)行的效率。目前瀏覽器在逐漸支持用標(biāo)記來加載模塊。 作者:Lin Clark 編譯:胡子大哈 翻譯原文:http://huziketang.com/blog/posts/detail?postId=58ce7fd3a6...

    mcterry 評論0 收藏0
  • 前端每周清單半年盤點(diǎn)之 WebAssembly

    摘要:前端每周清單專注前端領(lǐng)域內(nèi)容,以對外文資料的搜集為主,幫助開發(fā)者了解一周前端熱點(diǎn)分為新聞熱點(diǎn)開發(fā)教程工程實踐深度閱讀開源項目巔峰人生等欄目。利用降低三倍加載速度自推出之后,很多開發(fā)者都開始嘗試在小型項目中實踐,不過尚缺大型真實案例比較。 前端每周清單專注前端領(lǐng)域內(nèi)容,以對外文資料的搜集為主,幫助開發(fā)者了解一周前端熱點(diǎn);分為新聞熱點(diǎn)、開發(fā)教程、工程實踐、深度閱讀、開源項目、巔峰人生等欄目...

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

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

    邱勇 評論0 收藏0
  • 圖說 WebAssembly(六):現(xiàn)狀與展望

    摘要:現(xiàn)狀年月日,主流的四大瀏覽器達(dá)成了共識并宣布的最小可行產(chǎn)品已經(jīng)完成。更快的函數(shù)調(diào)用當(dāng)前,在中調(diào)用函數(shù)比想象的要慢。直接操作目前,沒有任何方式能夠操作。這就導(dǎo)致了部分應(yīng)用可能會因此而推遲發(fā)布時間。結(jié)束現(xiàn)如今已經(jīng)相當(dāng)快速。 本文是圖說 WebAssembly 系列文章的最后一篇。如果您還未閱讀之前的文章,建議您從第一篇入手。 現(xiàn)狀 2017 年 2 月 28 日,主流的四大瀏覽器達(dá)成了共識...

    clasnake 評論0 收藏0

發(fā)表評論

0條評論

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