9 标准库类型
2 分钟阅读
译文 · 基于 The Rust Performance Book
标准库类型
原文链接: https://nnethercote.github.io/perf-book/standard-library-types.html
值得通读常见标准库类型的文档——例如 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,通过闭包惰性计算错误值。例如,应把下面这段代码:
| |
改成:
| |
示例。
Option::map_or、Option::unwrap_or、Result::or、Result::map_or 和 Result::unwrap_or 也有类似的惰性替代方法。
Rc/Arc
Rc::make_mut/Arc::make_mut 提供写时复制(clone-on-write)语义。它们会返回 Rc/Arc 的可变引用。若引用计数大于 1,会 clone 内部值以确保唯一所有权;否则直接修改原值。虽不常用,但偶尔极其有用。
示例 1,
示例 2。
Mutex、RwLock、Condvar 和 Once
parking_lot crate 提供了这些同步类型的替代实现。parking_lot 类型的 API 和语义与标准库中对应类型相似,但不完全相同。
parking_lot 版本过去在某些平台上通常比标准库版本更小、更快、更灵活,但标准库版本已在部分平台上大幅改进。因此切换到 parking_lot 之前应先测量。
若决定全面使用 parking_lot 类型,很容易在某些地方误用标准库等价类型。可以使用 Clippy 来避免这一问题。