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 来避免这个问题。