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

为什么第二个 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 回答