为什么第一个SaveChanges比下面的调用要慢?

我正在调查我正在研究的一个实验性调度应用程序中的一些性能问题。 我发现调用session.SaveChanges()非常慢,所以我写了一个简单的测试。

你能解释为什么循环的第一次迭代需要200ms和后续的循环1-2毫秒? 我该如何在应用程序中利用此功能(如果所有后续调用都很快,我不介意第一次调用会变得很慢)?

private void StoreDtos()
{
    for (int i = 0; i < 3; i++)
    {
        StoreNewSchedule();
    }
}

private void StoreNewSchedule()
{
    var sw = Stopwatch.StartNew();
    using (var session = DocumentStore.OpenSession())
    {
        session.Store(NewSchedule());
        session.SaveChanges();
    }

    Console.WriteLine("Persisting schedule took {0} ms.", 
      sw.ElapsedMilliseconds);
}

输出是:

Persisting schedule took 189 ms. // first time
Persisting schedule took 2 ms.   // second time
Persisting schedule took 1 ms.   // ... etc

以上是针对内存数据库的。 使用到Raven数据库实例的http连接(在同一台机器上),我得到了类似的结果。 第一次通话需要更多时间:

Persisting schedule took 1116 ms.
Persisting schedule took 37 ms.
Persisting schedule took 14 ms.

在Github上:RavenDB 2.0测试代码和RavenDB 2.5测试代码。


你第一次调用RavenDB时,有几件事情必须发生。

  • 我们需要为您的实体准备序列化程序,这需要时间。
  • 我们需要创建到服务器的TCP连接。
  • 在接下来的调用中,我们可以重新使用已打开的连接和创建的序列化器。

    链接地址: http://www.djcxy.com/p/62023.html

    上一篇: Why is the first SaveChanges slower than following calls?

    下一篇: Can't create new DB in RavenDB 2.x