LINQパフォーマンスに関するFAQ
質問
私はLINQについて理解しようとしています。 最も悩ましいことは、構文をよりよく理解するとしても、表現力のために知らず知らずのうちにパフォーマンスを犠牲にしたくないということです。
効果的な LINQ」のための情報または書籍の良い一元的なリポジトリはありますか? そうでなければ、あなた自身の個人的なお気に入りの高性能な LINQ のテクニックは何ですか?
私は主に LINQ to Objects に関心がありますが、LINQ to SQL と LINQ to XML に関するすべての提案ももちろん歓迎します。 ありがとうございます。
どのように解決するのですか?
LINQ が内部で行っていることを理解するだけで、パフォーマンスが低下しているかどうかを知るのに十分な情報が得られるはずです。
LINQがパフォーマンスを助ける簡単な例を挙げます。この典型的な昔ながらのアプローチを考えてみましょう。
List<Foo> foos = GetSomeFoos();
List<Foo> filteredFoos = new List<Foo>();
foreach(Foo foo in foos)
{
if(foo.SomeProperty == "somevalue")
{
filteredFoos.Add(foo);
}
}
myRepeater.DataSource = filteredFoos;
myRepeater.DataBind();
つまり、上記のコードは2回繰り返し処理を行い、フィルタリングされた値を保持するために2つ目のコンテナを割り当てることになります。なんという無駄でしょう。と比べてみてください。
var foos = GetSomeFoos();
var filteredFoos = foos.Where(foo => foo.SomeProperty == "somevalue");
myRepeater.DataSource = filteredFoos;
myRepeater.DataBind();
これは一度だけ(リピータがバインドされたとき)反復処理されます; 元のコンテナだけを使用します。
filteredFoos
は単なる中間列挙子です。また、何らかの理由で、後でリピーターをバインドしないことにしても、何も無駄になることはありません。反復処理や評価も 1 度も行われません。
非常に複雑なシーケンス操作に入る場合、次のようにすることができます。 潜在的に LINQ固有の連鎖と遅延評価を活用することで、多くの利益を得ることができます。繰り返しますが、何事もそうですが、それが実際に何を行っているかを理解することが重要です。
関連
-
[解決済み] LINQを使用してList<T>から要素を削除する
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] LINQで複数の "order by "を使用する
-
[解決済み] 0.1fを0にすると、なぜ10倍もパフォーマンスが落ちるのですか?
-
[解決済み] LINQのGroup by
-
[解決済み] DataTableに対するLINQクエリ
-
[解決済み] LINQで.Firstと.FirstOrDefaultを使用するタイミングは?
-
[解決済み] LINQ集計アルゴリズム説明
-
[解決済み] LINQクエリでToList()とToArray()のどちらを呼び出すのが良いですか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】指定されたキャストが有効でない?
-
[解決済み】コンパイルエラー「未割り当てのローカル変数を使用しています」が発生したのはなぜですか?
-
[解決済み】ここで「要求URIに一致するHTTPリソースが見つかりませんでした」となるのはなぜですか?
-
[解決済み] [Entity Framework 4.1でエンティティに関連オブジェクトを追加する際に、エンティティオブジェクトをIEntityChangeTracker.の複数のインスタンスから参照できない。
-
解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C# [解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C#.
-
[解決済み】Socket.Selectがエラー "An operation was attempted on something that is not a socket" を返す。
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み] 関数を終了するには?
-
[解決済み】プロセスが実行されているかどうかを知るには?
-
[解決済み】名前 'ViewBag' が現在のコンテキストに存在しない - Visual Studio 2015