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
相关产品推荐
相关产品推荐

