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

Rust中Vec原地修改的理论与实际性能差异困惑

Rust Vec原地修改方式的性能基准测试与疑问

测试背景

为满足高性能数学库的需求,我对Rust Vec的三种原地修改方式进行了性能基准测试,三种方式如下:

  • 使用显式for循环
  • 调用迭代器的map()方法,收集为新Vec并覆盖原Vec
  • 调用迭代器的for_each()方法

测试代码

use std::time::{Instant, Duration};

const N_ITEMS: usize = 100000;
const N_BENCH_TIMES: i32 = 100;

fn bench_simple() {
    let mut a: Vec<i32> = vec![5; N_ITEMS];
    for i in a.iter_mut() {
        *i += 1;
    }
}

fn bench_iterator() {
    let mut a: Vec<i32> = vec![5; N_ITEMS];
    let a: Vec<i32> = a.iter_mut().map(|x| *x + 1).collect();
}

fn bench_foreach() {
    let mut a: Vec<i32> = vec![5; N_ITEMS];
    a.iter_mut().for_each(|x| *x += 1);
}

fn benchmark(name: &str, f: &dyn Fn()) {
    println!("Benchmark: {}", name);
    let mut time = Duration::new(0, 0);
    for _ in 0..N_BENCH_TIMES {
        let start_time = Instant::now();
        f();
        time += start_time.elapsed();
    }
    println!("Total: {:?} over {} instances", time, N_BENCH_TIMES);
    println!("Average: {:?}", time.div_f64(N_BENCH_TIMES as f64));
}

fn main() {
    benchmark("Simple", &bench_simple);
    benchmark("Iterator", &bench_iterator);
    benchmark("ForEach", &bench_foreach);
}

测试结果

Benchmark: Simple
Total: 402.619146ms over 100 instances
Average: 4.026191ms
Benchmark: Iterator
Total: 587.769728ms over 100 instances
Average: 5.877697ms
Benchmark: ForEach
Total: 409.527297ms over 100 instances
Average: 4.095273ms

文档引用

Rust文档提到:

"在某些场景下,for_each可能比循环更快,因为它会对Chain这类适配器使用内部迭代"

疑问

我原本预期for_each()比显式for循环更快,且两者都远快于需要创建新Vec的map()方式,但测试结果并非如此。我对这些迭代器的工作原理理解是否有误?


内容的提问来源于stack exchange,提问作者JS4137

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 07:00:22