标准库类型
值得通读常见标准库类型(如 Vec、Option、Result 和 Rc/Arc)的
文档,以找到有时可用于提升性能的有趣函数。
了解标准库类型的高性能替代方案也很有价值,例如 Mutex、RwLock、Condvar 和
Once。
Vec
创建长度为 n 的零填充 Vec 的最佳方法是使用 vec![0; n]。这很简单,并且可能
与替代方案一样快或更快,例如使用 resize、extend 或任何涉及 unsafe 的方式,
因为它可以利用操作系统的协助。
Vec::remove 移除特定索引处的元素并将所有后续元素向左移动一位,复杂度为 O(n)。
Vec::swap_remove 用最后一个元素替换特定索引处的元素,这不保持顺序,但复杂度为 O(1)。
Vec::retain 高效地从 Vec 中移除多个元素。其他集合类型如 String、HashSet 和
HashMap 也有等效的方法。
Option 和 Result
Option::ok_or 将 Option 转换为 Result,并接受一个 err 参数,当 Option
值为 None 时使用。err 是即时计算的。如果其计算开销很大,应改用
Option::ok_or_else,它通过闭包惰性地计算错误值。例如,这个:
#![allow(unused)]
fn main() {
fn expensive() {}
let o: Option<u32> = None;
let r = o.ok_or(expensive()); // 总是求值 `expensive()`
}
应改为:
#![allow(unused)]
fn main() {
fn expensive() {}
let o: Option<u32> = None;
let r = o.ok_or_else(|| expensive()); // 仅在需要时求值 `expensive()`
}
示例.
Option::map_or、Option::unwrap_or、
Result::or、Result::map_or 和 Result::unwrap_or 也有类似的替代方法。
Rc/Arc
Rc::make_mut/Arc::make_mut 提供了写时复制语义。它们获取 Rc/Arc 的可变引用。
如果引用计数大于 1,它们将 clone 内部值以确保唯一所有权;否则,它们将修改原始值。
虽然不常用,但偶尔会非常有用。
示例 1,
示例 2.
Mutex、RwLock、Condvar 和 Once
parking_lot crate 提供了这些同步类型的替代实现。parking_lot 类型的 API 和语义
与标准库中等效类型相似但不完全相同。
parking_lot 版本过去在体积、速度和灵活性上始终优于标准库版本,但标准库版本在某些
平台上已经有了很大改进。因此,在切换到 parking_lot 之前应该进行测量。
如果你决定普遍使用 parking_lot 类型,很容易在某些地方意外地使用标准库的等效类型。
你可以使用 Clippy 来避免这个问题。