fn double_vec(vec: Vec<i32>) -> Vec<i32> {
vec.into_iter().map(|x| x * 2).collect()
}
可能出现的性能问题
- 内存分配:在使用
map
和collect
过程中,collect
会创建一个新的Vec
,可能导致多次内存分配,特别是当原始Vec
较大时,频繁的内存分配和释放会带来性能开销。
- 迭代器开销:虽然迭代器通常很高效,但每次调用
map
闭包也会带来一些微小的开销,在处理大量元素时,这种开销会累积。
优化方法
- 预分配空间:可以预先计算出新
Vec
所需的容量,并使用with_capacity
方法预先分配足够的空间,这样可以减少collect
过程中的动态内存分配次数。
fn double_vec_optimized(vec: Vec<i32>) -> Vec<i32> {
let new_capacity = vec.len();
let mut result = Vec::with_capacity(new_capacity);
for num in vec {
result.push(num * 2);
}
result
}
- 减少闭包调用开销:在某些极端情况下,如果性能要求极高,可以考虑使用更底层的循环代替
map
方法,减少闭包调用的开销。但这种方式会使代码可读性变差,一般在性能瓶颈明确在map
闭包调用时才使用。例如:
fn double_vec_manual(vec: Vec<i32>) -> Vec<i32> {
let mut result = Vec::with_capacity(vec.len());
for i in 0..vec.len() {
result.push(vec[i] * 2);
}
result
}