6

重複
の可能性: LINQ は遅いので避けるべきですか?

私はLINQが大好きです。今日の別の投稿を読んだとき、「スライスしたパン以来最高のものだ」と私は完全に同意します. しかし、私が働いている会社では、他の誰もがLINQを嫌っているようです。

数週間前、私は初めて ReSharper を使用していました。コードを書いているときに、ReSharper が突然、foreach ループを LINQ 式に変換できると言ってきました。これは私にとって魔法のようで、同僚に見せました。驚いたことに、彼は次のように述べています。その方が早いでしょう!」

では、LINQ-to-Objects は本当に遅いのでしょうか? 私は自分自身を試してみました。次のサンプルを数回実行すると、Elapsed Ticks が 350 前後になります。

        Stopwatch sw = new Stopwatch();

        List<Person> personList = new List<Person>();
        for (int i = 0; i < 5000; i++)
        {
            Person p = new Person() {ID = i};
            personList.Add(p);
        }

        sw.Start();

        Person searchPerson = null;

        foreach (Person person in personList)
        {
            if (person.ID == 4321)
            {
                searchPerson = person;
                break;
            }
        }

        sw.Stop();

        Console.WriteLine(sw.ElapsedTicks);

ループを LINQ-Query に変更すると (Resharper がそれを行います)、約 900 の ElapsedTicks が得られます。ループの場合の 2 倍以上です。

Person searchPerson = personList.FirstOrDefault(person => person.ID == 4321);

LINQは確かに遅いようで、頻繁に使用すると問題になる可能性があります。そして、当社には多くのデータがあります。では、LINQ を避けるのは正しい決断でしょうか、それとも何か間違ったことをしているのでしょうか?

4

1 に答える 1

16

はい、遅くなります。ただし、その遅延の一部は、反復ごとの遅延ではなく、1 回限りの初期化遅延です。パーセンテージの差は、100k 反復ループではかなり低くなります。

特筆すべき点は、顧客がパフォーマンスの問題について苦情を言う場合を除き、開発者の時間は、コードのわずかなパフォーマンスの低下よりもはるかに高くつくということです。読みやすく保守しやすいコードを書くことは、コードをマイクロ最適化することよりもはるかに重要です。

Eric Lippert が完璧に指摘したように、LINQ は十分に高速でない場合にのみ避けるべきです。

于 2012-07-02T15:19:35.857 に答える