C#+WPFチューニング戦記

C#とWPFで高速なコードと最適なシステムを書くためにやってきたいろいろな事を書いてみます。.NET Frameworkのソースコードを読み解きましょう。なお、ここに書かれているのは個人の見解であって何らかの団体や企業の見解を代表するものではありません。

IEnumerableを扱う諸々について

 IEnumerable<TSource> を返すメソッドだからといって、こんなことをしていると凄い遅いコードが出力されます。

yield return new TSource();

yield return new TSource();

yield return new TSource();

プログラムの大半はループで構成されているのですから、ループが速くて悪いという事はありません。

メソッドの内部は、最も効率の良い具象型を用いましょう。ちなみに、上記のコードの最速例は以下のようになります。

return new[] {

    new TSource(),

    new TSource(),

    new TSource()

};

可読性の点では問題ありませんし、yield return を並べるよりは良い動きをします。外部からはIEnumerable<TSource>なので、インターフェース面の問題もありません。

また、MicrosoftLINQは具象型の種類に応じた個別の最適化を実装しています。 おおまかには、TSource配列、List<TSource>、IEnumerable<TSource>の順で速い実装が本当にあるのです。

http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs#38

C#で高速なコードを書くには、配列を嫌いにならないことが結構肝心です。

List<T>の内部も他のコレクションも内部的にはほとんどが配列です。

遅延評価することが重要といわれる局面でのみ、本当の意味でのIEnumerableが必要となるわけです。