2014-09-21 55 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

相關問題