-1

今日、wasm-bindgen を使用していくつかの錆びた wasm と js の速度のベンチマークを行っているときに、問題に遭遇しました。

ここでわかるように、単純な構造体を作成しました。 ここに画像の説明を入力

次に示すよう に、この構造体をgimmeDirectionsという単純な関数で使用しました。ここに画像の説明を入力

これをブラウザの JavaScript にコンパイルした後、コンパイルされた .d.ts ファイルを調べたところ、gimmeDirections 関数が数値を返していることがわかりました。 ここに画像の説明を入力

js では、コンパイルされたコードで以前に定義された XY のクラスを返したことを JSDOC で述べています。 ここに画像の説明を入力

ここにクラスがあります:

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