面试题答案
一键面试性能分析
-
直接在结构体初始化函数中填充数据:
- 优点:简单直接,在结构体创建时数据就已准备好,后续使用无需额外逻辑。
- 缺点:如果结构体创建频率高且初始化数据量大,会导致程序启动时性能开销大,占用较多内存。
-
使用
lazy_static
宏延迟初始化:- 优点:只有在实际使用结构体数据时才进行初始化,减少程序启动时的开销,对于不常使用的数据能有效节省内存。
- 缺点:引入了额外的复杂性,访问数据时需要通过
lazy_static
提供的方式访问,并且需要考虑线程安全等问题(lazy_static
默认是线程安全的)。
一般来说,如果结构体不是频繁创建,且初始化后数据会被频繁使用,直接在初始化函数中填充数据更合适;如果结构体创建频繁但数据不一定都被使用,或者初始化开销很大,使用
lazy_static
宏延迟初始化能提升性能。
代码实现
直接在结构体初始化函数中填充数据
struct BigData {
large_array: Vec<i32>,
}
impl BigData {
fn new() -> Self {
let mut large_array = Vec::with_capacity(1000000);
for i in 0..1000000 {
large_array.push(i);
}
BigData { large_array }
}
}
fn main() {
let data = BigData::new();
// 使用data.large_array
}
使用lazy_static
宏延迟初始化
use lazy_static::lazy_static;
struct BigData {
large_array: Vec<i32>,
}
impl BigData {
fn new() -> Self {
let mut large_array = Vec::with_capacity(1000000);
for i in 0..1000000 {
large_array.push(i);
}
BigData { large_array }
}
}
lazy_static! {
static ref LAZY_DATA: BigData = BigData::new();
}
fn main() {
// 只有在访问LAZY_DATA时才会初始化
let data = &*LAZY_DATA;
// 使用data.large_array
}
在Cargo.toml
文件中需添加依赖:
[dependencies]
lazy_static = "1.4.0"