1

ラムダ式がパフォーマンス キラーである場合、なぜ C# がラムダ式を提供するのでしょうか?

以下を実行しようとしています:

Stopwatch sw = new Stopwatch();
 sw.Start();
 x = x.Select((int i) => i += 1).ToArray();
 sw.Stop();
 Console.WriteLine(sw.ElapsedTicks);

Stopwatch sw = new Stopwatch();
sw.Start();
for (int j = 0; j < 1000; j++) y[j] += 1;
sw.Stop();
Console.WriteLine(sw.ElapsedTicks);

x = 1000 の場合、大きな違いが見られます。

ラムダの適切なユースケースはありますか?

4

3 に答える 3

8

ラムダ式を使用するコードは、x1000 個すべての要素を取得して新しい配列にコピーし、1000 個すべての値の新しい値を計算します。同じ配列内の 1000 個の既存の要素をインプレースで変更するよりも明らかにコストがかかります。

それを正しく行う方法!

簡単: 適切な目的のために LINQ とデリゲートを使用します。数値の配列を取り、そのすべての値をインクリメントすることは、私が LINQ を使用するものではありません。

C# がラムダ (デリゲートと式ツリーのシンタックス シュガー) を提供しているからといって、すべてにラムダを使用する必要があるわけではありません。適切な目的でそれらを使用すると、実際のパフォーマンス ヒットが発生しないことに気付くでしょう。少なくとも、観察しているほどひどいものではありません。

于 2012-05-27T07:52:17.237 に答える
1

LINQ は QUERIES のための言語であることを覚えておく必要があると思います。もちろん、コレクションの更新 (SO でよく聞かれる方法) やループの実行など、他のこともできますが、なぜこれを行うのでしょうか? LINQ とラムダ式は、手続き型プログラミングを完全に置き換える新しいものではなく、適切な場合に使用できるツールにすぎません。
他のクエリ言語 (t-sql など) と同様に、LINQ は、取得したい方法ではなく、取得したいものを定義するツールを提供します。これにより、言語に依存しないクエリを後で作成することもできます。あなたが望むものに解析します。多くの場合に使用するのは非常に便利で汎用的であり、基礎となるデータ型/データソースを抽象化することもできますが、クエリのパーサーを作成した人に要求したものを取得するために HOW の具体的な実装を残すことも意味します.
そこにあるいくつかのサンプルlinqプロバイダーについて読むことをお勧めします。たとえば、LINQ to LDAP を見てみましょう。このようなプロバイダーを使用すると、開発者は必要なデータのみに集中でき、使用するのがかなり面倒な基礎となるデータ構造/Active Directory API には集中できません。
他のすべてのツールと同様に、何を取得したいのか、このツールが最善の方法であるかどうかを自問する必要があります。SQL サーバークエリでループを使用するのは、良い例えです。もちろん、それは可能ですが、通常は、SQL エンジンがクエリの実行方法を決定できるようにする select を構築することを好みます。

于 2012-05-27T09:27:11.270 に答える
0

パフォーマンス キラーである場合、なぜ C# はラムダ式を提供するのでしょうか?

パフォーマンスは通常、読み取り可能なコードの重要性に比べてそれほど重要ではないためです。

于 2012-05-27T10:24:32.053 に答える