やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Rustのイテレータ(パフォーマンス)

 高速なまま。

参考

ループvsイテレータ

 なんと、forループとイテレータでは、イテレータのほうが速いらしい。

 本当か? 言い回しも怪しい。

ベンチマークのコードは説明しません。 なぜなら、要点は、2つのバージョンが等価であることを証明することではなく、 これら2つの実装がパフォーマンス的にどう比較されるかを大まかに把握することだからです。

 なぜかコード抽象化の話にすり替わった。パフォーマンスの話どこいった。

重要なのは: イテレータは、 高度な抽象化にも関わらず、低レベルのコードを自身で書いているかのように、ほぼ同じコードにコンパイルされることです。

 でも、以下のように明言している。

イテレータは、Rustのゼロ代償抽象化の一つであり、これは、抽象化を使うことが追加の実行時オーバーヘッドを生まないことを意味しています。

 イテレータを含むループ処理は機械語に翻訳される。実行時にオーバーヘッドがなくなって高速化する。

Rustコードは、どんな機械語コードにコンパイルされるのでしょうか?えー、執筆時点では、 手作業で書いたものと同じ機械語コンパイルされます。coefficientsの値の繰り返しに対応するループは全く存在しません: コンパイラは、12回繰り返しがあることを把握しているので、ループを「展開」します。 ループの展開は、ループ制御コードのオーバーヘッドを除去し、代わりにループの繰り返しごとに同じコードを生成する最適化です。

結論

コードは、高レベルだけれども、 そうすることに対して実行時のパフォーマンスを犠牲にしない

  • ゼロ代償抽象化(クロージャイテレータの実装)
    • 抽象化したコードを端的に表現できる
    • 抽象化したコードても高速に実行できる

前回まで