gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:04:16 25 4
gpt4 key购买 nike

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

这是我使用的脚本:

fn main() {
test_64_mul();
test_32_mul();
}

fn test_64_mul() {
let test_num: u64 = 12345678653435363454;
use std::time::Instant;
let mut now = Instant::now();
let mut elapsed = now.elapsed();
for _ in 1..2000 {
now = Instant::now();
let _prod = test_num as u128 * test_num as u128;
elapsed = elapsed + now.elapsed();
}
println!("Elapsed For 64: {:.2?}", elapsed);
}

fn test_32_mul() {
let test_num: u32 = 1234565755;
use std::time::Instant;
let mut now = Instant::now();
let mut elapsed = now.elapsed();
for _ in 1..2000 {
now = Instant::now();
let _prod = test_num as u64 * test_num as u64;
elapsed = elapsed + now.elapsed();
}
println!("Elapsed For 32: {:.2?}", elapsed);
}

运行这段代码后的输出是

经过 64 次:25.58µs

经过 32: 26.08µs

我正在使用带有 M1 芯片的 MacBook Pro和 rust 版本 1.60.0

最佳答案

因为编译器已经注意到你没有使用结果,所以完全消除了乘法。

查看 https://rust.godbolt.org/z/5sjze7Mbv 上的差异.

你应该使用类似 std::hint::black_box() ,或者更好的基准测试框架,如 criterion .

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

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

关于rust - 为什么 64 位乘法的性能与 32 位乘法相当?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72372738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com