tinygo wasm 优化对比js原生

原文链接: tinygo wasm 优化对比js原生

上一篇: go wasm fib 对比原生js

下一篇: tinygo 安装

体积大幅度缩小

up-5e65877a6b1e3c5084c58f86243515c0e56.png

速度更快

up-015db126f1db819e2b778c51115970a8b01.png

参考

https://tinygo.org/

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"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值