MST

星途 面试题库

面试题:Rust 字符串拼接性能优化

假设有一个需求,需要在 Rust 中拼接大量的字符串片段(例如从一个字符串向量 `vec: Vec<String>` 中拼接所有字符串),请分析 `+` 运算符、`format!` 宏和 `String::with_capacity` 结合 `push_str` 方法在这种场景下的性能差异,并编写代码实现一种性能较好的拼接方式。
36.7万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

性能分析

  1. + 运算符:使用 + 运算符拼接字符串时,每次拼接都会创建一个新的 String 实例,因为 + 运算符会消耗左操作数。这意味着对于大量字符串片段的拼接,会产生大量的中间字符串对象,导致频繁的内存分配和复制,性能较差。
  2. format!format! 宏的工作方式类似 printf 系列函数,它会在内部构建一个格式化字符串。虽然它可以很方便地格式化字符串,但对于简单的字符串拼接场景,它同样会创建中间数据结构,在处理大量字符串拼接时,由于多次内存分配和复制,性能也不理想。
  3. String::with_capacity 结合 push_str 方法String::with_capacity 方法预先分配足够的内存来容纳最终的字符串,然后通过 push_str 方法逐一把字符串片段追加到这个字符串中,避免了频繁的内存重新分配,性能较好。

代码实现

fn main() {
    let vec: Vec<String> = vec![
        "Hello".to_string(),
        ", ".to_string(),
        "world!".to_string(),
    ];

    let mut result = String::with_capacity(vec.iter().map(|s| s.len()).sum());
    for s in &vec {
        result.push_str(s);
    }

    println!("{}", result);
}

这种方式先根据所有字符串片段的总长度预先分配足够的内存,然后逐个追加片段,减少了内存重新分配的开销,性能更优。