在用wasm进行的一些实验中,我发现我的手工编码wasm比js多2倍。 替代,它与i32.rem_s
操作有关。
笏码:
(module
(func $add (param $p1 i32)
(result i32)
(local $i i32) (local $s i32)
(local.set $i (local.get $p1))
(local.set $s (i32.const 0))
loop $while
(i32.add (local.get $i) (local.get $s))
(i32.rem_s (i32.const 1000007))
local.set $s
(i32.add (local.get $i) (i32.const -1))
local.set $i
(i32.ne (i32.const 0) (local.get $i))
br_if $while
end
local.get $s
)
(export "add" (func $add))
)
JS代码(包括基准代码(:
import { add } from "./add.wasm";
const n = 100000000;
const x = new Date;
console.log(add(n));
console.log(new Date - x);
const y = new Date;
let s = 0;
for (let i = n; i > 0; i -= 1) {
s = (s + i) % 1000007;
}
console.log(s);
console.log(new Date - y);
结果:
244650
892
244650
483
问题出在哪里?我的手工编码程序集未优化?JS有一个非常 智能优化?还是 V8 的 wasm 运行器中的错误?
我正在使用英特尔corei7在我的Ubuntu上运行它,如果它很重要,请使用nodejs v14.2.0。
您已经执行了我所说的"微基准测试",这是一段非常小的代码,它使用有限数量的指令,并多次迭代。这种基准测试技术非常不准确!
是的,JavaScript,一旦优化,可以满足接近原生的性能。
您正在比较完全不同的操作 - JavaScript 数字都是底层的浮点数,而使用 WebAssembly 时,您使用的是 32 位整数。