fn main() {
let nested: Vec<HashMap<String, Vec<u32>>> = vec![
HashMap::from([("key1".to_string(), vec![1, 2, 3])]),
HashMap::from([("key2".to_string(), vec![4, 5, 6])]),
];
let mut total_sum = 0;
for map in &nested {
for (_, inner_vec) in map.iter() {
for num in inner_vec {
total_sum += num;
}
}
}
println!("Total sum: {}", total_sum);
}
性能优化
- 减少内存分配:上述代码没有引入额外的内存分配。使用
&
进行引用遍历,避免了数据的复制,从而减少内存分配开销。
- 减少借用检查开销:
- 通过
for map in &nested
使用不可变引用遍历Vec<HashMap<String, Vec<u32>>>
,这样在遍历HashMap
和内部Vec<u32>
时,可以在同一作用域内安全地进行操作,减少了借用检查带来的潜在复杂性。
- 因为
HashMap
和Vec
都是连续存储,迭代器的遍历方式在内存访问上具有较好的局部性,提高了缓存命中率,进一步优化性能。
Rust所有权和生命周期机制对性能优化的影响
- 所有权:
- Rust的所有权系统确保了在编译时就能避免许多常见的内存安全问题,如悬空指针和内存泄漏。在上述代码中,通过引用遍历集合,所有权没有发生转移,因此不需要额外的资源管理开销(如移动语义导致的内存重新分配等)。
- 对于
HashMap
和Vec
,它们的所有权在栈上,数据存储在堆上。引用遍历使得堆上的数据可以高效地被访问,而不需要进行昂贵的所有权转移操作。
- 生命周期:
- 生命周期注解确保了引用的有效性。在这个例子中,
&nested
的生命周期覆盖了内部对HashMap
和Vec<u32>
的遍历,使得编译器可以验证整个遍历过程中引用的有效性,在保证内存安全的同时,不会引入过多额外的运行时检查,从而优化了性能。