-1

今天在使用 wasm-bindgen 进行一些 rust wasm vs js 速度基准测试时,我遇到了一个问题。

我做了一个简单的结构,你可以在这里看到: 在此处输入图像描述

我在一个名为gimmeDirections的简单函数中使用了这个结构, 如下所示: 在此处输入图像描述

将其编译到浏览器 javascript 中后,我查看了编译到其中的 .d.ts 文件,并注意到 gimmeDirections 函数返回了一个数字。 在此处输入图像描述

即使在 js 中,它在 JSDOC 中声明它返回了 XY 类,该类在编译代码中已定义。 在此处输入图像描述

这是课程:

export class XY {

    static __wrap(ptr) {
        const obj = Object.create(XY.prototype);
        obj.ptr = ptr;

        return obj;
    }

    free() {
        const ptr = this.ptr;
        this.ptr = 0;

        wasm.__wbg_xy_free(ptr);
    }
    /**
    * @returns {number}
    */
    get x() {
        var ret = wasm.__wbg_get_xy_x(this.ptr);
        return ret;
    }
    /**
    * @param {number} arg0
    */
    set x(arg0) {
        wasm.__wbg_set_xy_x(this.ptr, arg0);
    }
    /**
    * @returns {number}
    */
    get y() {
        var ret = wasm.__wbg_get_xy_y(this.ptr);
        return ret;
    }
    /**
    * @param {number} arg0
    */
    set y(arg0) {
        wasm.__wbg_set_xy_y(this.ptr, arg0);
    }
}

在非常困惑之后,由于打字稿说它会返回一个数字但js说它会返回一个类,我决定运行它......并得到一个数字。 在此处输入图像描述

下面的对象是我的 javascript 函数,它为基准运行运行相同的代码,如您所见,我得到的是一个对象,而不是一个数字。

这是我的 JS 代码:

import * as funcs from './wasm/wildz.js';
// compiled wasm js file
function directionsJS(x, y) {
    let xX = x;
    let yY = y;
    if (Math.abs(xX) === Math.abs(yY)) {
        xX /= Math.SQRT2;
        yY /= Math.SQRT2;
    }
    return {
        x: x,
        y: yY
    };
}
(async() => {
    const game = await funcs.default();
    console.time('Rust Result'); console.log(game.gimmeDirections(10, 10)); 
    console.timeEnd('Rust Result'); console.time('JS Result'); 
    console.log(directionsJS(10, 10)); console.timeEnd('JS Result');
})();

当我清楚地返回一个对象时,我仍然很困惑为什么它会返回一个数字。非常需要帮助,非常感谢

4

1 回答 1

2

在 wasm-bindgen 指南的Exporting a struct to JS中解释了大部分内容以及更多内容,但我会总结一下。

Rust 结构通过动态分配空间并返回指向它的指针来“返回”。关于返回的函数,您所看到的number是绑定 JS 运行时和 wasm 模块的“原始” ffi 函数。它只是返回那个指针值。

生成的XYJavascript 类是该指针值的包装器,并提供与之交互的函数。生成的gimmeDirections函数是创建该类的 wasm 模块调用的包装器。

于 2020-11-06T04:33:29.797 回答