探索方法
只聞其名,從未實踐過的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是指某一種程式語言還是指機器碼的速度?