Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

标准库类型

值得通读常见标准库类型(如 VecOptionResultRc/Arc)的 文档,以找到有时可用于提升性能的有趣函数。

了解标准库类型的高性能替代方案也很有价值,例如 MutexRwLockCondvarOnce

Vec

创建长度为 n 的零填充 Vec 的最佳方法是使用 vec![0; n]。这很简单,并且可能 与替代方案一样快或更快,例如使用 resizeextend 或任何涉及 unsafe 的方式, 因为它可以利用操作系统的协助。

Vec::remove 移除特定索引处的元素并将所有后续元素向左移动一位,复杂度为 O(n)。 Vec::swap_remove 用最后一个元素替换特定索引处的元素,这不保持顺序,但复杂度为 O(1)。

Vec::retain 高效地从 Vec 中移除多个元素。其他集合类型如 StringHashSetHashMap 也有等效的方法。

OptionResult

Option::ok_orOption 转换为 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_orOption::unwrap_orResult::orResult::map_orResult::unwrap_or 也有类似的替代方法。

Rc/Arc

Rc::make_mut/Arc::make_mut 提供了写时复制语义。它们获取 Rc/Arc 的可变引用。 如果引用计数大于 1,它们将 clone 内部值以确保唯一所有权;否则,它们将修改原始值。 虽然不常用,但偶尔会非常有用。 示例 1, 示例 2.

MutexRwLockCondvarOnce

parking_lot crate 提供了这些同步类型的替代实现。parking_lot 类型的 API 和语义 与标准库中等效类型相似但不完全相同。

parking_lot 版本过去在体积、速度和灵活性上始终优于标准库版本,但标准库版本在某些 平台上已经有了很大改进。因此,在切换到 parking_lot 之前应该进行测量。

如果你决定普遍使用 parking_lot 类型,很容易在某些地方意外地使用标准库的等效类型。 你可以使用 Clippy 来避免这个问题。