You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何该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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 06:32:38