Why is the first SaveChanges slower than following calls?

I'm investigating some performance problems in an experimental scheduling application I'm working on. I found that calls to session.SaveChanges() were pretty slow, so I wrote a simple test.

Can you explain why the first iteration of the loop takes 200ms and subsequent loop 1-2 ms? How I can I leverage this in my application (I don't mind the first call to be this slow if all subsequent calls are quick)?

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);
}

Output is:

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

Above is for an in-memory database. Using a http connection to a Raven DB instance (on the same machine), I get similar results. The first call takes noticeably more time:

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

On Github: RavenDB 2.0 testcode and RavenDB 2.5 testcode.


The very first time that you call RavenDB, there are several things that have to happen.

  • We need to prepare the serializers for your entities, which takes time.
  • We need to create the TCP connection to the server.
  • On the next calls, we can reuse the connection that is already open and the created serializers.

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

    上一篇: 我在哪里可以下载用于构建服务器的.NET 4.5 Multitargeting Pack?

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