JavaScript也能寫WebAssembly

liujiusheng發表於2018-12-21

探索方法

只聞其名,從未實踐過的WebAssembly。 照我的想法,做前端開發的大多熟悉指令碼語言,不精通C、C++、rust等語言。

那麼有一個方法可以用js寫了原始碼編譯成webassembly就好了。於是找了好久找到了walt這個東西。

walt

walt可以用AssemblyScript 來編寫程式碼並自動編譯,AssemblyScript 是TypeScript的子集。

配置方法參考:github.com/ballercat/w…

呃。。。這一篇估計會有點難寫,可能得看一下原始碼了。

用walt寫了幾行程式碼,好像一直出錯,官方文件也不夠豐富,不知道怎麼解決,決定再探索一下其它方法。

放棄walt使用 assemblyscript

又探索了一下,發現了個不需要使用walt也可以用TypeScript寫WebAssembly的辦法,參考正面的url: github.com/AssemblyScr…

大致思路就是:使用asc工具,將assemblyscript編寫的程式碼生成.wasm 檔案,再使用new WebAssembly.Instance()和new WebAssembly.Module()將其載入為js可讀取的程式碼。最終用js呼叫。

記錄一段載入.wasm並呼叫其中方法的程式碼吧。

fetch('./module.optimized.wasm')
        .then(response => response.arrayBuffer())
        .then(function(result){
            console.log(result);
            let myModule = new WebAssembly.Instance(new WebAssembly.Module(result, {}));
            console.log(myModule.exports.add());
        });
複製程式碼

全部原始碼地址

對比測試

將斐波那契測試n值設定為50時原生js耗時: 243727毫秒,WebAssembly耗時: 87325毫秒。效能差異巨大。

有空的時候得再測試一下C和JAVA與它的效能對比。

哭,相同環境下JAVA跑出來只要40000多毫秒。

語言 n值 耗時(ms)
js 50 243727
WebAssembly 50 87325
JAVA 50 40000
C - -

本次測試中WebAssembly運算速度大概為js的3倍,JAVA的1/2,相對來說效能已經有了極大的提升。

但是為什麼比JAVA慢,個人認為效能瓶頸應該是出在了WebAssembly編譯器上。

以後應該仔細研究一下WebAssembly的編譯器。

還有許多沒有搞明白的,比如:官網上說的native speed是指某一種程式語言還是指機器碼的速度?

文章還會持續更新,源文地址

參考資料:

  1. www.ibm.com/developerwo…

  2. AssemblyScript專案主頁

相關文章