Standard Library Types
值得阅读常见标准库类型的文档–如Vec、Option、Result和Rc–以找到有趣的函数,有时可以用来提高性能。
还值得了解标准库类型的高性能替代品,如Mutex、RwLock、Condvar和Once。
Box
表达式 Box::default() 的效果与 Box::new(T::default()) 相同,但可能更快,因为编译器可以直接在堆上创建值,而不是在堆栈上构造值然后复制它。
示例。
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 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 }
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做了一个可改变的引用。如果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 来避免这个问题。