为什么 64 位乘法的性能与 32 位乘法相当?

muh*_*ris 3 rust

我正在测量两个 64 位数字相乘与两个 32 位数字相乘时的 Rust 性能。回想一下,64 位乘法的结果是 128 位数字,32 位乘法的结果是 64 位数字。我预计 64 位乘法至少比其他乘法慢 2 倍。主要是因为没有原生 128 位支持,并且要将两个 64 位数字相乘,您将它们分为 32 位高位和低位。然而,当我进行测试时,发现两者的表现相似。

\n

这是我使用过的脚本:

\n
fn main() {\n    test_64_mul();\n    test_32_mul();\n}\n\nfn test_64_mul() {\n    let test_num: u64 = 12345678653435363454;\n    use std::time::Instant;\n    let mut now = Instant::now();\n    let mut elapsed = now.elapsed();\n    for _ in 1..2000 {\n        now = Instant::now();\n        let _prod = test_num as u128 * test_num as u128;\n        elapsed = elapsed + now.elapsed();\n    }\n    println!("Elapsed For 64: {:.2?}", elapsed);\n}\n\nfn test_32_mul() {\n    let test_num: u32 = 1234565755;\n    use std::time::Instant;\n    let mut now = Instant::now();\n    let mut elapsed = now.elapsed();\n    for _ in 1..2000 {\n        now = Instant::now();\n        let _prod = test_num as u64 * test_num as u64;\n        elapsed = elapsed + now.elapsed();\n    }\n    println!("Elapsed For 32: {:.2?}", elapsed);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

运行此代码后的输出是

\n

已用时间 64: 25.58\xc2\xb5s

\n

已用时间 32: 26.08\xc2\xb5s

\n

我使用的是配备 M1 芯片\n和 rust 版本 1.60.0 的 MacBook Pro

\n

Cha*_*man 7

因为编译器注意到您没有使用结果,并完全消除了乘法。

请参阅https://rust.godbolt.org/z/5sjze7Mbv上的差异。

您应该使用类似std::hint::black_box()或更好的基准测试框架(例如criteria)

Instant此外,每次创建新的开销可能比乘法本身高得多。就像我说的,使用基准测试框架。

正如@StephenC 所指出的,您的时钟分辨率也不太可能小到足以测量一次乘法。

  • 此外,基准测试还在循环中调用“Instant::now()”和“now.elapsed()”。因此,即使编译器没有消除乘法,“经过的时间”很可能包括大量的开销。然后存在的问题是时钟分辨率可能太差而无法准确测量执行乘法的时间。 (3认同)