面试题答案
一键面试代码实现
#[derive(Debug)]
struct User {
username: String,
age: u32,
email: String,
}
impl User {
fn to_network_format(&self) -> String {
format!("{}:{}:{}", self.username, self.age, self.email)
}
}
性能问题
- 内存分配:
format!
宏在运行时会进行内存分配,每次调用format!
都会产生新的堆内存分配,这在高频率调用场景下会导致较多的内存碎片,影响性能。 - 字符串拼接开销:
format!
内部会进行字符串拼接操作,拼接过程中涉及字符的多次复制,尤其是在结构体字段较多或者字段值较大时,复制操作会带来额外的性能开销。
优化方法
- 减少内存分配:可以使用
String::with_capacity
预先分配足够的内存,减少动态内存分配次数。例如:
impl User {
fn to_network_format_opt(&self) -> String {
let mut result = String::with_capacity(
self.username.len() + self.email.len() + 10 + 2, // 10 for u32 max length, 2 for two colons
);
result.push_str(&self.username);
result.push(':');
result.push_str(&self.age.to_string());
result.push(':');
result.push_str(&self.email);
result
}
}
- 使用
write!
宏:write!
宏允许直接写入到实现了Write
trait的类型,减少中间临时字符串的创建。例如,可以写入到String
或Vec<u8>
。
use std::fmt::Write;
impl User {
fn to_network_format_write(&self) -> String {
let mut result = String::new();
write!(result, "{}:{}:{}", self.username, self.age, self.email).unwrap();
result
}
}
这种方式在复杂格式化场景下,可能比format!
更高效,因为它减少了不必要的中间数据复制。