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

迭代器

collectextend

Iterator::collect 将迭代器转换为集合(如 Vec),这通常需要一次分配。如果之后 只是再次迭代该集合,则应避免调用 collect

因此,从函数返回 impl Iterator<Item=T> 这样的迭代器类型通常比返回 Vec<T> 更好。 请注意,如这篇博客文章所述,这些返回类型有时需要额外的 lifetime 标注。 示例.

类似地,你可以使用 extend 用迭代器扩展现有集合(如 Vec),而不是将迭代器收集到 Vec 中再使用 append

最后,在编写迭代器时,如果可能的话,实现 Iterator::size_hintExactSizeIterator::len 方法通常是有价值的。使用该迭代器的 collectextend 调用可能会进行更少的分配,因为它们预先知道了迭代器产生的元素数量。

链式操作

chain 非常方便,但也可能比单个迭代器慢。对于热门的迭代器,如果可能的话, 最好避免使用。 示例.

类似地,filter_map 可能比先使用 filter 再使用 map 更快。

块迭代

当需要块迭代器且已知块大小正好能整除切片长度时,请使用更快的 slice::chunks_exact 而不是 slice::chunks

当不确定块大小是否能正好整除切片长度时,使用 slice::chunks_exact 并结合 ChunksExact::remainder 或手动处理多余元素仍然可能更快。 示例 1, 示例 2.

同样的情况也适用于相关的迭代器:

copied

当迭代整数等小型数据类型的集合时,使用 iter().copied() 可能比 iter() 更好。 消费该迭代器的代码将按值而非按引用接收整数,LLVM 在这种情况下可能生成更好的代码。 示例 1, 示例 2.

这是一项高级技术。你可能需要检查生成的机器码以确定它是否有效。有关如何执行此操作的 详细信息,请参阅机器码章节。