为何该Rust引用与拷贝性能测试用例结果与预期相反?
为什么使用引用的版本反而更慢?
核心问题出在你对Rust中Copy类型的拷贝开销存在误解:
usize是Copy类型,它的拷贝只是简单的位复制,在CPU层面就是寄存器间的数据移动,几乎没有任何性能开销。你认为“用引用避免拷贝能提速”的前提完全不成立——这里根本没有值得优化的拷贝成本。- 反而,使用引用的版本额外增加了解引用操作:
r + &1000需要先解引用r和临时引用&1000才能执行加法,这两步额外操作会带来可测量的微小开销,导致整体耗时更长。
编译器优化的额外影响
你的测试代码中,factorial(6)的结果是固定值720,在--release优化模式下,编译器会直接把它替换成常量,甚至整个循环都可能被优化掉。但哪怕在debug模式下,Copy类型的拷贝开销依然远低于引用的解引用开销。
修正测试逻辑
如果你想验证引用的性能优势,应该用非Copy类型(比如String)——这类类型的拷贝是深拷贝,开销巨大,此时引用的优势才会体现出来。示例代码如下:
#[test] fn test_string_ref() { use std::time::Instant; let iterations = 1_000_000; // 使用引用 let start = Instant::now(); let s = "hello world".to_string(); for _ in 0..iterations { let r = &s; let _ = r.len(); } let duration_ref = start.elapsed(); // 不使用引用(每次深拷贝String) let start = Instant::now(); let s = "hello world".to_string(); for _ in 0..iterations { let cloned = s.clone(); let _ = cloned.len(); } let duration_no_ref = start.elapsed(); println!("Time with reference: {:?}", duration_ref); println!("Time without reference: {:?}", duration_no_ref); assert!(duration_ref < duration_no_ref); }
这个测试里,引用版本会比拷贝版本快得多,因为String::clone()的深拷贝开销远大于引用的解引用操作。
内容的提问来源于stack exchange,提问作者Zhang Lei
相关产品推荐
相关产品推荐

