10 迭代器

迭代器与性能

译文 · 基于 The Rust Performance Book

迭代器

原文链接: https://nnethercote.github.io/perf-book/iterators.html

collect 和 extend

Iterator::collect 将迭代器转换为 Vec 等集合,通常需要分配内存。若集合随后仅被再次迭代,应避免调用 collect。

因此,函数返回 impl Iterator<Item=T> 往往比返回 Vec<T> 更好。注意有时这些返回类型需要额外的生命周期参数,这篇博客文章有说明。 示例。

类似地,可以用 extend 用迭代器扩展现有集合(如 Vec),而不是先把迭代器 collect 成 Vec 再 append。

最后,编写迭代器时,若可能,通常值得实现 Iterator::size_hint 或 ExactSizeIterator::len 方法。使用这些迭代器的 collect 和 extend 调用可能因此减少分配次数,因为它们能提前知道迭代器将产生的元素数量。

链式组合

chain 非常方便,但也可能比单个迭代器更慢。对热点迭代器,若可能,值得避免使用。 示例。

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

分块

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

当分块大小未知能否整除切片长度时,仍可结合 ChunksExact::remainder 或手动处理剩余元素来使用 slice::chunks_exact,这样往往更快。 示例 1, 示例 2。

相关迭代器同理:

copied

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

这是进阶技巧。你可能需要检查生成的机器码才能确认是否有效。详见机器码一章。

最后修改 August 23, 2026: 更新 (499855b16)