Standard Library Types

值得阅读常见标准库类型的文档–如VecOptionResultRc–以找到有趣的函数,有时可以用来提高性能。

还值得了解标准库类型的高性能替代品,如MutexRwLockCondvarOnce

Box

表达式 Box::default() 的效果与 Box::new(T::default()) 相同,但可能更快,因为编译器可以直接在堆上创建值,而不是在堆栈上构造值然后复制它。 示例

Vec

创建长度为 n 的零填充 Vec 的最佳方法是使用 vec![0; n]。这种方法简单且可能比其他方法更快,比如使用 resizeextend 或涉及 unsafe 的任何操作,因为它可以利用操作系统的帮助。

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

Vec::retain 可以高效地从 Vec 中移除多个项。其他集合类型如 StringHashSetHashMap 也有类似的方法。

Option and 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()); // always evaluates `expensive()`
}

should be changed to this:

#![allow(unused)]
fn main() {
fn expensive() {}
let o: Option<u32> = None;
let r = o.ok_or_else(|| expensive()); // evaluates `expensive()` only when needed
}

Example.

Option::map_orOption::unwrap_orResult::orResult::map_orResult::unwrap_or有类似的替代方案。

Rc/Arc

Rc::make_mut/Arc::make_mut提供了clone-on-write语义。它对Rc做了一个可改变的引用。如果refcount大于1,它将clone内部值以确保唯一的所有权;否则,它将修改原始值。它不经常需要,但偶尔会非常有用。 Example 1, Example 2.

Mutex, RwLock, Condvar, and Once

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

过去,parking_lot 版本通常比标准库中的版本更小、更快、更灵活,但在某些平台上,标准库版本已经有了很大改进。因此,在切换到 parking_lot 之前,您应该进行测量。

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