MST

星途 面试题库

面试题:Rust中map函数的基本使用及优化

给定一个包含整数的`Vec<i32>`,使用`map`函数将每个元素翻倍,并返回新的`Vec<i32>`。同时,阐述一下在这个过程中可能出现的性能问题及如何优化。
15.7万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
fn double_vec(vec: Vec<i32>) -> Vec<i32> {
    vec.into_iter().map(|x| x * 2).collect()
}

可能出现的性能问题

  1. 内存分配:在使用mapcollect过程中,collect会创建一个新的Vec,可能导致多次内存分配,特别是当原始Vec较大时,频繁的内存分配和释放会带来性能开销。
  2. 迭代器开销:虽然迭代器通常很高效,但每次调用map闭包也会带来一些微小的开销,在处理大量元素时,这种开销会累积。

优化方法

  1. 预分配空间:可以预先计算出新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
}
  1. 减少闭包调用开销:在某些极端情况下,如果性能要求极高,可以考虑使用更底层的循环代替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
}