面试题答案
一键面试- 选择合适的字符串实用函数优化性能:
- 按行读取:
- 使用
BufReader
结合File
来按行高效读取大文件。例如:use std::fs::File; use std::io::{BufRead, BufReader}; let file = File::open("large_text_file.txt").expect("Failed to open file"); let reader = BufReader::new(file); for line in reader.lines() { let line = line.expect("Failed to read line"); // 对line进行处理 }
- 使用
- 字符串分割:
- 对于简单的分割,可以使用
split
方法。如果分割字符固定且不复杂,split
效率较高。例如:let line = "a,b,c"; for part in line.split(',') { // 处理分割后的部分 }
- 如果需要更复杂的分割,比如按多个字符或正则表达式分割,可以使用
regex
库。但要注意,正则表达式分割通常比简单字符分割慢。例如:use regex::Regex; let re = Regex::new(r"[,:;]").unwrap(); let line = "a,b;c:d"; for part in re.split(line) { // 处理分割后的部分 }
- 对于简单的分割,可以使用
- 字符串拼接:
- 使用
String
的push_str
方法来拼接字符串。push_str
避免了不必要的内存重新分配,效率较高。例如:let mut result = String::new(); let part1 = "hello"; let part2 = " world"; result.push_str(part1); result.push_str(part2);
- 如果要拼接多个字符串,可以考虑使用
collect
方法结合iter
。例如:let parts = vec!["a", "b", "c"]; let result: String = parts.iter().collect();
- 使用
- 按行读取:
- 避免性能陷阱:
- 避免不必要的内存分配:
- 尽量复用已有的字符串对象,而不是频繁创建新的字符串。例如,在拼接时优先使用
push_str
而不是+
操作符,因为+
操作符会创建新的字符串对象。
- 尽量复用已有的字符串对象,而不是频繁创建新的字符串。例如,在拼接时优先使用
- 注意
clone
和to_string
:- 避免不必要的
clone
和to_string
调用。这些操作会创建新的字符串副本,增加内存开销。只有在确实需要独立的字符串副本时才使用。
- 避免不必要的
- 优化正则表达式:
- 如果使用正则表达式,要对其进行优化。复杂的正则表达式可能导致性能急剧下降。尽量简化正则表达式逻辑,避免使用过于复杂的模式。
- 减少循环内的动态分配:
- 把可以在循环外计算或分配的操作移到循环外。例如,创建正则表达式对象(如果使用)可以在循环外进行,而不是在每次循环中创建。
- 避免不必要的内存分配: