2012-04-24 95 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