我正在处理.net应用程序,并使用由5个列表和1个哈希表组成的对象。该对象用于迭代至少500次以执行某些分析的循环中。在每个循环中,这个对象应该是空的,所以我想知道在所有的List和Hashtable上调用clear是否更有效率,还是应该重新初始化对象?清除集合或重新初始化?
我知道我可以编写代码来进行基准测试,但是我想知道是否有人已经走过了这条路?
谢谢。
我正在处理.net应用程序,并使用由5个列表和1个哈希表组成的对象。该对象用于迭代至少500次以执行某些分析的循环中。在每个循环中,这个对象应该是空的,所以我想知道在所有的List和Hashtable上调用clear是否更有效率,还是应该重新初始化对象?清除集合或重新初始化?
我知道我可以编写代码来进行基准测试,但是我想知道是否有人已经走过了这条路?
谢谢。
虽然我同意另一个答案,这是一个微观优化,但为了回答问题,我发现使用列表时,新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毫秒。
然而,这个结果是如此之近,这是明确表示:
我不认为你浪费了你的时间。感谢您付出的努力。 – DOK 2012-04-24 13:01:29
一,你正在使用DateTime类来达到这个目的。更好地使用StopWatch以获得更高的准确性。二,你正在测试代码中执行另一项重要操作(例如'List
@nawfal感谢您的评论和upvote!完全同意StopWatch的观点;现在我倾向于在DateTime上使用这个类,并且会敦促其他人也这样做。我也同意关于lst.Add的观点。事后看来,我应该在被基准测试的代码区域之外填充列表。尽管从两个测试用例使用相同的代码开始,这会掩盖真实的结果,但结果(以最快的方式)仍应该是有效的。 – 2014-06-02 15:31:53
创建3000个空集合的成本很小。除非你的“分析”是非常微不足道的,否则这根本不会很重要。编写最清晰的代码 - 这可能是每次创建一组新集合,而不是重复使用它们。如果逻辑操作要重用该对象,则只应重用该对象。
一旦你以最可读的方式编写代码,测试它的性能是否与你需要的一样好。如果不是,然后您可以开始微优化。
我会,但是,强烈建议您使用Dictionary<,>
而不是Hashtable
。
即使在创建10万个空集合的基准测试中,我在时间上只看到了00:00.001的差异。可读性首先。尼斯回答乔恩。 – 2012-04-24 12:39:37
浪费我的时间“我知道我可以写代码来衡量这个“ - 你的环境和代码与其他人不同。做基准。我想补充一点,这似乎是一个微观优化。您的代码实际上是否遇到性能问题? – Oded 2012-04-24 12:31:52
这真的取决于你对对象和集合所做的事情。你甚至可以放一个标志并说它是空的,然后覆盖内容而不清除。 – 2012-04-24 12:32:55
可能的重复[什么是更快的C#:清除收集或实例化新](http://stackoverflow.com/questions/10901020/what-is-faster-in-c-clear-collection-or-instantiate-new) – nawfal 2014-06-02 15:01:43