今天在使用 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');
})();
当我清楚地返回一个对象时,我仍然很困惑为什么它会返回一个数字。非常需要帮助,非常感谢