我编写了一段非常基础的代码来计算一个数是否为质数,使用 Rust(编译为 WASM)和 JavaScript 进行算术性能基准测试。
我完全预计 Rust/WASM 会比 JavaScript 更快。在我做过的其他算术基准测试中,Rust/WASM 似乎比 JavaScript 更有优势,或者至少与之匹配。然而,在这个测试中,JavaScript 的表现似乎要比 WASM 好得多,我真的没有解释。
Rust 代码:
pub fn calculate_is_prime(number: u64) -> bool {
if number == 1 {
return false;
}
if number == 2 {
return true;
}
for i in 2..number {
if number % i == 0 {
return false;
}
}
return true;
}
#[wasm_bindgen]
pub fn bench_rs(max: u64) -> u64 {
(1..=max).map(|n| calculate_is_prime_rs(n) as u64).sum()
}
JavaScript代码:
function calculateIsPrime(number) {
if (number === 1) {
return false;
}
if (number === 2) {
return true;
}
for (let i = 2; i < number; i++) {
if (number % i === 0) {
return false;
}
}
return true;
}
function bench_js(max) {
let tot = 0;
for (let n = 1; n <= max; n++) {
tot += calculateIsPrime(n);
}
return tot;
}
let max = 200000;
console.log(`Amount of primes under ${max} is ${bench_js(max)}`);
基础示例项目:https://github.com/Mcluky/Stack-Overflow-Rust-Wasm-Performance-Example
我已经检查/完成的事项:
- 在构建Rust代码时,始终设置了
--release
标志。 - 在我的机器上直接运行Rust代码,比JS和WASM都快得多,因此我怀疑它与WASM目标有关。
- 将 Rust 中的整数类型 (u64) 替换为浮点数 (f64),因为 JavaScript 使用的是浮点数,但结果相似。
- 通过迭代测试以确保其一致性。
- 尝试在 Rust 版本中使用
while
而不是for-in
,以防它没有像你想象的那样被优化。