3

これらのシナリオのどれがより高速でしょうか?

シナリオ 1:

foreach (var file in directory.GetFiles())
{
    if (file.Extension.ToLower() != ".txt" &&
        file.Extension.ToLower() != ".bin")
        continue;

    // Do something cool.
}

シナリオ 2:

var files = from file in directory.GetFiles()
                where file.Extension.ToLower() == ".txt" ||
                      file.Extension.ToLower() == ".bin"
                select file;

foreach (var file in files)
{
     // Do something cool.
} 

実行が遅れているため、論理的には同じであることはわかっていますが、どちらが速いでしょうか? なぜ?

4

4 に答える 4

6

通常、高速化自体は問題ではありません。特に、このようなシナリオでは、有意なパフォーマンスの違いはありません (一般的に、コードがボトルネックにならない場合は問題になりません)。問題は、どちらがより読みやすく、コードの意図をより明確に表現するかです。

コードの 2 番目のブロックは、コードの意図をより明確に表していると思います。「特定のプロパティを持ついくつかのファイル名のファイル名のコレクションをクエリする」と読み、次に「そのプロパティを持つそれらのファイル名のそれぞれについて、何かをする」と読みます。どのように起こるかではなく、何が起こっているかを宣言します。What をメカニズムから分離することで、コードの 2 番目のブロックがより明確になり、LINQ が真価を発揮します。LINQ を使用して what を宣言し、以前は what がメカニズムと混同されていたのではなく、LINQ にメカニズムを実装させます。

LINQ は高速ですか、それとも単に便利ですか?

したがって、タイトルの質問に答えるために、LINQ は通常、パフォーマンスを大幅に妨げることはありませんが、コーダーが何かを実行する方法に集中するのではなく、実行したいことを宣言できるようにすることで、コードをより明確にします。結局のところ、私たちは方法ではなく、何を気にします。

実行が遅れているため、論理的には同じであることはわかっていますが、どちらが速いでしょうか?

LINQ の使用にはわずかなオーバーヘッドがあるため、おそらく必須バージョンです。しかし、どちらがより速いかを本当に知る必要がある場合は、必ずプロファイラーを使用し、実際のデータでテストしてください。

なぜ?

LINQ によってオーバーヘッドが少し増えるためです。しかし、トレードオフはコードが大幅に明確になり、保守しやすくなります。これは、通常は無関係なパフォーマンスの低下と比較して、大きなメリットです。

于 2010-12-08T18:10:53.677 に答える
2

ディレクトリに大量のファイルが含まれている場合やネットワークドライブ上にある場合はGetFiles("*.txt")、を実行する方が高速です。GetFile("*.bin")

それに比べて、LINQの余分なオーバーヘッドは単なるノイズです。

于 2010-12-08T18:17:21.067 に答える
1

Linq は高速ではなく、利便性も重要ではありません。むしろ、Linq は高階関数FoldMap、およびFilterを (異なる名前で) .NET に取り込みます。これらの関数は、コードをDRYアップできるため、価値があります。セカンダリ コレクションまたは結果を使用して反復を設定するたびに、バグが発生する可能性があります。Linq を使用すると、反復内で何が起こるかに集中でき、反復メカニズムにバグがないことを確信できます。

これは、Linq が手動反復より厳密に遅いという意味ではありません。他の人が述べたように、ケースバイケースでベンチマークする必要があります。

于 2010-12-08T18:39:03.590 に答える
0

linq とストアド プロシージャのベンチマーク、およびコンパイル済み linq の使用に関するコード プロジェクトに関する記事を書きました。

ご覧ください。

http://www.codeproject.com/KB/cs/linqsql2.aspx

あなたがローカル ファイルの解析を見ていることは理解しています。この記事では、何が関係しており、舞台裏で linq が何をしているのかを理解することができます。

于 2010-12-08T18:14:44.163 に答える