迭代器
collect 和 extend
Iterator::collect 将迭代器转换为集合(如 Vec),这通常需要一次分配。如果之后
只是再次迭代该集合,则应避免调用 collect。
因此,从函数返回 impl Iterator<Item=T> 这样的迭代器类型通常比返回 Vec<T> 更好。
请注意,如这篇博客文章所述,这些返回类型有时需要额外的 lifetime 标注。
示例.
类似地,你可以使用 extend 用迭代器扩展现有集合(如 Vec),而不是将迭代器收集到
Vec 中再使用 append。
最后,在编写迭代器时,如果可能的话,实现 Iterator::size_hint 或
ExactSizeIterator::len 方法通常是有价值的。使用该迭代器的 collect 和 extend
调用可能会进行更少的分配,因为它们预先知道了迭代器产生的元素数量。
链式操作
chain 非常方便,但也可能比单个迭代器慢。对于热门的迭代器,如果可能的话,
最好避免使用。
示例.
类似地,filter_map 可能比先使用 filter 再使用 map 更快。
块迭代
当需要块迭代器且已知块大小正好能整除切片长度时,请使用更快的 slice::chunks_exact
而不是 slice::chunks。
当不确定块大小是否能正好整除切片长度时,使用 slice::chunks_exact 并结合
ChunksExact::remainder 或手动处理多余元素仍然可能更快。
示例 1,
示例 2.
同样的情况也适用于相关的迭代器:
slice::rchunks、slice::rchunks_exact和RChunksExact::remainder;slice::chunks_mut、slice::chunks_exact_mut和ChunksExactMut::into_remainder;slice::rchunks_mut、slice::rchunks_exact_mut和RChunksExactMut::into_remainder.
copied
当迭代整数等小型数据类型的集合时,使用 iter().copied() 可能比 iter() 更好。
消费该迭代器的代码将按值而非按引用接收整数,LLVM 在这种情况下可能生成更好的代码。
示例 1,
示例 2.
这是一项高级技术。你可能需要检查生成的机器码以确定它是否有效。有关如何执行此操作的 详细信息,请参阅机器码章节。