我正在测量两个 64 位数字相乘与两个 32 位数字相乘时的 Rust 性能。回想一下,64 位乘法的结果是 128 位数字,32 位乘法的结果是 64 位数字。我预计 64 位乘法至少比其他乘法慢 2 倍。主要是因为没有原生 128 位支持,并且要将两个 64 位数字相乘,您将它们分为 32 位高位和低位。然而,当我进行测试时,发现两者的表现相似。
\n这是我使用过的脚本:
\nfn 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}\nRun 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因为编译器注意到您没有使用结果,并完全消除了乘法。
请参阅https://rust.godbolt.org/z/5sjze7Mbv上的差异。
您应该使用类似std::hint::black_box()或更好的基准测试框架(例如criteria)。
Instant此外,每次创建新的开销可能比乘法本身高得多。就像我说的,使用基准测试框架。
正如@StephenC 所指出的,您的时钟分辨率也不太可能小到足以测量一次乘法。