MST

星途 面试题库

面试题:Rust字符串长度计算在不同数据结构下的性能差异

假设你有两种存储字符串的数据结构,一种是 `String` 类型,另一种是 `&str` 类型切片,并且有大量这样的字符串需要计算长度。请分析并通过代码示例说明在这两种数据结构下计算字符串长度操作的性能差异,以及为什么会有这样的差异。
46.3万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

String&str 计算长度性能分析

  1. String 类型String 是一个可增长的、拥有所有权的字符串类型。它在堆上分配内存,除了存储字符串数据外,还包含一个长度字段(记录字符串的字节长度)、容量字段等额外信息。计算长度时,由于长度字段已经维护好了,所以获取长度的操作时间复杂度为 O(1)。 以下是 Rust 代码示例:
fn main() {
    let s = String::from("hello");
    let len = s.len();
    println!("The length of '{}' is {}", s, len);
}
  1. &str 类型切片&str 是一个字符串切片,它是对字符串数据的一个引用,通常指向 String 或者字符串字面量。它同样在编译时就已经知道了字符串的长度(存储在切片结构中),获取长度操作的时间复杂度也是 O(1)。 示例代码如下:
fn main() {
    let s = "hello";
    let len = s.len();
    println!("The length of '{}' is {}", s, len);
}

性能差异及原因:在计算字符串长度的操作上,String&str 的性能几乎没有差异。因为两者都维护了字符串的长度信息,获取长度时都是直接读取这个已有的长度值,时间复杂度均为 O(1)。但从内存角度来看,&str 只是一个指向字符串数据的引用,占用的内存空间较小(通常为指针大小加上长度字段大小),而 String 除了字符串数据本身外,还需要额外存储长度、容量等信息,占用内存稍多。在处理大量字符串时,如果主要关注长度计算,两者性能相当;但如果对内存占用敏感,&str 会更有优势。