2012-04-24 94 views
0

我正在處理.net應用程序,並使用由5個列表和1個哈希表組成的對象。該對象用於迭代至少500次以執行某些分析的循環中。在每個循環中,這個對象應該是空的,所以我想知道在所有的List和Hashtable上調用clear是否更有效率,還是應該重新初始化對象?清除集合或重新初始化?

我知道我可以編寫代碼來進行基準測試,但是我想知道是否有人已經走過了這條路?

謝謝。

+0

浪費我的時間「我知道我可以寫代碼來衡量這個「 - 你的環境和代碼與其他人不同。做基準。我想補充一點,這似乎是一個微觀優化。您的代碼實際上是否遇到性能問題? – Oded 2012-04-24 12:31:52

+0

這真的取決於你對對象和集合所做的事情。你甚至可以放一個標誌並說它是空的,然後覆蓋內容而不清除。 – 2012-04-24 12:32:55

+0

可能的重複[什麼是更快的C#:清除收集或實例化新](http://stackoverflow.com/questions/10901020/what-is-faster-in-c-clear-collection-or-instantiate-new) – nawfal 2014-06-02 15:01:43

回答

4

雖然我同意另一個答案,這是一個微觀優化,但爲了回答問題,我發現使用列表時,新List比Clear更快。這是我的基準代碼:

static void Main(string[] args) 
    { 
     var start = DateTime.Now; 
     List<string> lst = new List<string>(); 

     for (int i = 0; i < 3000; ++i) 
     { 
      //lst = new List<string>(); 
      lst.Clear(); 
      for (int j = 0; j < 500; ++j) 
      { 
       lst.Add(j.ToString()); 
      } 
     } 

     Console.WriteLine("{0} ms", ((DateTime.Now - start).Ticks/TimeSpan.TicksPerMillisecond)); 
     Console.ReadLine(); 
    } 

超過五次運行,新列表平均340.8毫秒,清除平均值354.8毫秒。

然而,這個結果是如此之近,這是明確表示:

  1. ,這種差異可能毫無意義
  2. 我可能通過執行這一基準
+0

我不認爲你浪費了你的時間。感謝您付出的努力。 – DOK 2012-04-24 13:01:29

+0

一,你正在使用DateTime類來達到這個目的。更好地使用StopWatch以獲得更高的準確性。二,你正在測試代碼中執行另一項重要操作(例如'List .Add'),這本身將花費很多時間給你幾乎沒有意義的值。三,'新列表()'與'.Clear()'相比是一種不同的操作,因爲後者保留了容量(以便後面的添加變得更快)。你可以在前一種情況下達到同樣的效果:'新列表(lst.Capacity);''+1仍然是基準。 – nawfal 2014-06-02 15:05:49

+1

@nawfal感謝您的評論和upvote!完全同意StopWatch的觀點;現在我傾向於在DateTime上使用這個類,並且會敦促其他人也這樣做。我也同意關於lst.Add的觀點。事後看來,我應該在被基準測試的代碼區域之外填充列表。儘管從兩個測試用例使用相同的代碼開始,這會掩蓋真實的結果,但結果(以最快的方式)仍應該是有效的。 – 2014-06-02 15:31:53

6

創建3000個空集合的成本很小。除非你的「分析」是非常微不足道的,否則這根本不會很重要。編寫最清晰的代碼 - 這可能是每次創建一組新集合,而不是重複使用它們。如果邏輯操作要重用該對象,則只應重用該對象。

一旦你以最可讀的方式編寫代碼,測試它的性能是否與你需要的一樣好。如果不是,然後您可以開始微優化。

,但是,強烈建議您使用Dictionary<,>而不是Hashtable

+0

即使在創建10萬個空集合的基準測試中,我在時間上只看到了00:00.001的差異。可讀性首先。尼斯回答喬恩。 – 2012-04-24 12:39:37