为何Rust编译的WASM计算质数性能不及JavaScript?
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)}`);
已排查/执行的操作
- 确保构建Rust代码时始终添加
--release参数 - 直接在本机运行Rust代码,速度远快于JS和WASM,因此怀疑问题与WASM目标有关
- 尝试将Rust中的整数类型(u64)替换为浮点数(f64),结果类似
- 多次测试确保结果一致
- 尝试在Rust版本中用
while替代for-in,以防优化效果不及预期
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

