首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何导出WebAssembly函数?

如何导出WebAssembly函数?
EN

Stack Overflow用户
提问于 2020-03-08 23:06:35
回答 1查看 735关注 0票数 0

我想要做的是WASM加载程序具有给定的要求:

  1. 在运行时只导入一次WASM函数,而其他IIFE函数中的
  2. 则直接调用WASM函数。等待它加载(如果不是present.
  3. Export it (testWASM) ),以便可以从其他模块异步调用它。

这样做是可行的:

代码语言:javascript
复制
let testWASM;

  (async() => {
    const config = {
        env: {
            __memory_base: 0,
            __table_base: 0,
            memory: new WebAssembly.Memory({
                initial: 256,
            }),
            table: new WebAssembly.Table({
                initial: 0,
                element: 'anyfunc',
            }),
        }
      }
      const fetchPromise = fetch(process.env.PUBLIC_URL + '/hello.wasm');
      const {instance} = await WebAssembly.instantiateStreaming(fetchPromise, config);
      testWASM = instance.exports.fib;
      console.log(testWASM());
  })();

  setTimeout(() => {
    console.log(testWASM());
}, 2000)

显然,setTimeout是非常糟糕的方法。

编辑: hello.c:

代码语言:javascript
复制
#include <emscripten.h>

EMSCRIPTEN_KEEPALIVE
int fib() {
  return 42;
}

构建命令:

代码语言:javascript
复制
emcc hello.c -Os -s WASM=1 -s SIDE_MODULE=1 -o hello.wasm

编辑:

这在出口方面很好,但我认为它不符合第一项要求。它非常慢,我认为这是因为每次调用函数时都会获取:

wasm.js

代码语言:javascript
复制
module.exports = async () => {
  const config = {
    env: {
      __memory_base: 0,
      __table_base: 0,
      memory: new WebAssembly.Memory({
        initial: 256
      }),
      table: new WebAssembly.Table({
        initial: 0,
        element: "anyfunc"
      })
    }
  };
  const fetchPromise = fetch(process.env.PUBLIC_URL + "/hello.wasm");
  const { instance } = await WebAssembly.instantiateStreaming(
    fetchPromise,
    config
  );
  return instance.exports.fib();
};

然后我们可以如下所示:

代码语言:javascript
复制
import * as foo from './wasm.js'

const bar = async () => {
  console.log(await foo())
}

bar(); //42
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-09 00:39:15

这似乎很好:

代码语言:javascript
复制
let cache;

module.exports = async (x, y, z) => {
  if (cache) {
    return cache(x, y, z);
  } else {
    const config = {
      env: {
        __memory_base: 0,
        __table_base: 0,
        memory: new WebAssembly.Memory({
          initial: 256
        }),
        table: new WebAssembly.Table({
          initial: 0,
          element: "anyfunc"
        })
      }
    };
    const fetchPromise = fetch(process.env.PUBLIC_URL + "/hello.wasm");
    const { instance } = await WebAssembly.instantiateStreaming(
      fetchPromise,
      config
    );
    cache = instance.exports.mandelIter;
    return instance.exports.mandelIter(x, y, z);
  }
};

但出于某种原因,它比一般的JS函数慢了0.1秒。奇怪..。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60592916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档