原文链接: tinygo wasm 优化对比js原生
上一篇: go wasm fib 对比原生js
下一篇: tinygo 安装
体积大幅度缩小
速度更快
参考
https://github.com/tinygo-org/tinygo/tree/master/src/examples/wasm
fib-tiny,go
不仅可以将方法导出, 也可以使用js的方法
使用注释导出, 使用env环境导入js
package main
// module from JavaScript.
func Add(x int, y int) int
//go:export Fib
func Fib(n int) int {
if n < 2 {
return n
}
return Fib(n-1) + Fib(n-2)
}
func main() {
println("WASM Go Initialized", Fib(2))
println("go Add", Add(1, 2))
}
// set GOARCH=wasm
// set GOOS=js
// go build -o lib.wasm main.go
// tinygo build -o fib-tiny.wasm -target=wasm ./fib-tiny.go
fib-tiny.html
导入时目前不能使用main.Add, 需要使用文件名, 很奇怪不知道是不是win平台的bug
<!DOCTYPE html>
<!--
Copyright 2018 The Go Authors. All rights reserved.
Use of this source code is governed by a BSD-style
license that can be found in the LICENSE file.
-->
<html>
<head>
<meta charset="utf-8"/>
<title>Go wasm</title>
</head>
<body>
<script src="../wasm_exec_tiny.js"></script>
<script>
// let wasmURL = "./fib.wasm"
let wasmURL = "./fib-tiny.wasm"
const go = new Go(); // Defined in wasm_exec.js
go.importObject.env['fib-tiny.go.Add'] = function Add(x, y) {
return x + y
}
console.log(go.importObject.env)
console.log(go)
const WASM_URL = './fib-tiny.wasm';
var wasm;
if ('instantiateStreaming' in WebAssembly) {
console.log('go.importObject', go.importObject)
WebAssembly.instantiateStreaming(fetch(WASM_URL), go.importObject).then(function (obj) {
console.log('obj', obj)
wasm = obj.instance;
go.run(wasm, go.importObject);
})
} else {
fetch(WASM_URL).then(resp =>
resp.arrayBuffer()
).then(bytes =>
WebAssembly.instantiate(bytes, go.importObject).then(function (obj) {
wasm = obj.instance;
go.run(wasm);
})
)
}
function fibJS(n) {
return n < 2 ? n : fibJS(n - 1) + fibJS(n - 2)
}
let size = 35
function testTime(f) {
let st = +new Date()
for (let i = 0; i <= size; i++)
f(i)
let ed = +new Date()
return ed - st
}
function test() {
for (let i = 0; i < 10; i++) {
let timeGo = testTime(wasm.exports.Fib)
let timeJS = testTime(fibJS)
console.log({
timeGo, timeJS
})
}
}
</script>
<button onclick="test()">test</button>
</body>
</html>
tinygo的wasm包需要使用自己的js, 需要复制到路径下
"C:\tinygo\targets\wasm_exec.js"