2017-10-04 62 views
0

我試圖衡量一些表現,但我偶然發現了一些我反對相信的反直覺結果。也就是說,查詢Dictionary<DateTime>的速度是,在DEBUG模式下比在RELEASE模式下快日期時間字典在DEBUG模式下更快?

顯然,錯誤必須在我的測量程序 - 但在哪裏?這是它:

 Dictionary<DateTime, int> d1 = new Dictionary<DateTime, int>(); 

     // fill the dictionary 
     DateTime now = DateTime.Now; 
     const int items = 100000; 
     for (int i = 0; i < items; i++) 
     { 
      DateTime item = now.AddSeconds(-i); 
      d1.Add(item, i); 
     } 
     Console.WriteLine("Items ready"); 

     const int calls = 100000000; 
     DateTime queryDate = DateTime.Now; 

     // query the dictionary 
     var stopwatch = Stopwatch.StartNew(); 
     for (int i = 0; i < calls; i++) 
     { 
      int j; 
      if (d1.TryGetValue(queryDate, out j)) 
      { 
       throw new InvalidOperationException(); 
      } 
     } 
     stopwatch.Stop(); 
     Console.WriteLine("{0}ms", stopwatch.ElapsedMilliseconds); 

我通過點擊Ctl-F5啓動這個控制檯應用程序,所以VS沒有連接。在我的筆記本電腦上,我在DEBUG編譯版本中獲得了大約1200ms的時間,在RELEASE模式下大約爲2200ms(!)。

我已經檢查/嘗試:

  • 項目設置是VS 2015只是默認:「優化代碼」被選中的釋放,但不進行調試。要重現,只需創建一個新的控制檯應用程序項目並將代碼複製粘貼到Program
  • 當我用int作爲字典的關鍵字類型來測量同樣的事情時,RELEASE模式比DEBUG稍微快一點。

請幫忙揭開我的盲點!

+0

你測量過多少次? – SeM

+0

十,二十次。我無法也不能相信它。 – Dejan

+0

@HansPassant:* duh *,我用的是x86。我知道,這是愚蠢的。我沒有想到「首選32位」是新項目的默認設置。學過的知識。你想發表你的評論作爲答案,所以我可以接受它嗎? – Dejan

回答

1

VS2015中新項目的默認設置是「首選32位」。對於這個特定的代碼,似乎x86抖動表現爲次優。

據漢斯帕桑特:

沒有太多的優化器可以做些什麼來改善這個代碼。可以設置TryGetValue()調用的堆棧框架的兩種基本方式。代碼生成器使用一種方式,即通過將參數直接寫入堆棧的「現代」方法。但優化器使用另一種方式,即使用PUSH的「舊」方式。效率較低的方式。這是針對x86抖動的,x64抖動沒有這個問題。

實際上,切換到64位時,RELEASE模式會變得稍微快一點。