0

このコードでは:

static bool Spin(int WaitTime)
{
    Console.WriteLine("Running task {0} : thread {1}]",
        Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
    Thread.Sleep(WaitTime);
    return true;
}

public void DemoPLINQLong()
{
    var SomeBigNumber = 1000000;
    var sequence = Enumerable.Range(0, SomeBigNumber);
    var sw = new Stopwatch();
    sw.Start();
    sequence.Where(i => Spin(SomeBigNumber));
    sw.Stop();
    var synchTime = sw.Elapsed;
    sw.Restart();
    sequence.Where(i => Spin(SomeBigNumber));
    sw.Stop();
    var asynchTime = sw.Elapsed;
    Console.WriteLine("Synchronous: {0}  Asynchronous: {1}",
        synchTime.ToString(), asynchTime.ToString());
}

結果は一貫しています: 同期: 00:00:00.0021800 非同期: 00:00:00.0000076

2 番目の LINQ クエリが何百倍も高速なのはなぜですか? ある種のキャッシングが行われていますか?どのように?

4

1 に答える 1

3

DotNet は、何かが初めて実行されるときにパフォーマンスの最適化をキャッシュして作成します。これはジャスト イン タイム環境 (JIT) として知られています。同じコードへの後続の呼び出しで、ランタイム環境は既存の最適化を再利用できます。これが、ほとんどすべての最初の実行が、同じコードの後続の実行よりもはるかに遅いことがよくある理由です。

投稿されたコードに関する補足事項:

  1. 「同期」と「非同期」という用語が何を指しているのかわかりません。両方の例はまったく同じものであり、非同期はありません。
  2. ご存じないかもしれませんが、LINQ の遅延実行の性質により、この例では LINQ は評価されていません。sequence.Where(i => Spin(SomeBigNumber))例を からに変更すると、この動作を確認できますsequence.Where(i => Spin(SomeBigNumber)).ToList()。ここで、ToList() は LINQ 述語の評価を強制し、Console.WriteLine がSpinメソッドでコンソールに書き込まれます。
于 2012-09-30T00:39:11.120 に答える