イテレータ
collect と extend
Iterator::collect は、イテレータを Vec などのコレクションに変換します。通常、これにはメモリ割り当てが必要です。そのコレクションを再びイテレートするだけであれば、collect の呼び出しは避けるべきです。
このため、関数から Vec<T> を返すよりも、impl Iterator<Item=T> のようなイテレータ型を返す方がよいことがよくあります。なお、このブログ記事で説明されているように、これらの戻り値の型には追加のライフタイムが必要になる場合があります。
例。
同様に、イテレータを Vec に collect してから append を使用するのではなく、extend を使用して既存のコレクション(Vec など)をイテレータで拡張できます。
最後に、イテレータを作成するときは、可能であれば Iterator::size_hint または ExactSizeIterator::len メソッドを実装する価値があることがよくあります。そのイテレータを使用する collect や extend の呼び出しでは、イテレータが生成する要素数に関する事前情報が得られるため、メモリ割り当て回数を減らせる場合があります。
チェーン
chain は非常に便利ですが、単一のイテレータより遅くなることもあります。可能であれば、ホットなイテレータでは避ける価値があるかもしれません。
例。
同様に、filter の後に map を使用するよりも、filter_map の方が速い場合があります。
チャンク
チャンク化するイテレータが必要で、チャンクサイズがスライスの長さを正確に割り切ることが分かっている場合は、slice::chunks の代わりに、より高速な slice::chunks_exact を使用してください。
チャンクサイズがスライスの長さを正確に割り切ることが分かっていない場合でも、slice::chunks_exact を ChunksExact::remainder または余剰要素の手動処理と組み合わせて使用する方が速い場合があります。
例 1、
例 2。
関連するイテレータについても同じことが当てはまります。
slice::rchunks、slice::rchunks_exact、およびRChunksExact::remainderslice::chunks_mut、slice::chunks_exact_mut、およびChunksExactMut::into_remainderslice::rchunks_mut、slice::rchunks_exact_mut、およびRChunksExactMut::into_remainder
copied
整数などの小さなデータ型のコレクションをイテレートする場合、iter() の代わりに iter().copied() を使用する方がよい場合があります。そのイテレータを消費するものは、整数を参照ではなく値で受け取り、その場合 LLVM がより良いコードを生成する可能性があります。
例 1、
例 2。
これは高度なテクニックです。効果があることを確かめるには、生成されたマシンコードを確認する必要があるかもしれません。その方法の詳細については、マシンコードの章を参照してください。