2014-09-21 60 views
1

我正在调查我正在进行的实验性日程安排应用程序中的一些性能问题。我发现拨打session.SaveChanges()的速度很慢,所以我写了一个简单的测试。为什么第一个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 testcodeRavenDB 2.5 testcode

回答

1

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

  • 我们需要为您的实体准备序列化器,这需要时间。
  • 我们需要创建到服务器的TCP连接。

在接下来的调用中,我们可以重新使用已打开的连接和创建的序列化器。

+0

有什么方法可以进行某种热身? – jimmystormig 2015-02-10 13:36:19

+1

只是向RavenDB提出请求,它会处理很多成本,是的。 – 2015-02-12 07:09:07

相关问题