简单的基本问题

时间:2011-04-23 12:29:52

标签: c# java windows-phone-7

很抱歉提出这么简单的问题,但想澄清一个概念。

下面是我的代码,我在for循环中创建一个字典

if(condition)
{
  // some code here
  for(int i=0; i<length; i++)
  {
    Dictionary<string, string> parameter = new Dictionary<string, string>();
    parameter.Add("ServiceTypeID", "1");
    parameter.Add("Description", "disc");
  }
}
每次我应该在for循环之前创建字典对象并在字典对象上应用clear方法,而不是创建字典对象,如

if(condition)
{
  Dictionary<string, string> parameter = new Dictionary<string, string>();
  // some code here
  for(int i=0; i<length; i++)
  {
    parameter.clear();
    parameter.Add("ServiceTypeID", "1");
    parameter.Add("Description", "disc");
  }
}

在这两个选项中,哪个选项会更好。

谢谢, 零

3 个答案:

答案 0 :(得分:2)

在大多数实际情况中,差异接近于零。

有人可能会认为清除数据结构比初始化空数据更快。这并非总是如此。请注意,现代语言(C#,Java)内存管理器已经过优化,可以分配许多小对象(这与垃圾收集器的工作方式有关)。在C ++中,由于缺少GC,内存管理器被调整为分配少量大对象。因此,在循环内重构字典与清除它是相当的(性能方面)。

此外,clear()可能不一定释放所有已分配的内存。它可能只是重置一些指针/索引。因此,如果使用clear(),您的Dictionary可能仍会占用大块内存,这可能会降低代码的其他部分的速度。

结论:除非剖析器告诉您这是您程序的瓶颈,否则不要担心。

答案 1 :(得分:0)

如果这两种解决方案都适合你,你应该记住两件事:

  • 第一个在每个循环中创建字典对象,因此在每个循环时间内分配内存的速度较低
  • 第二个更快。但是将Dictionary对象保留更长时间,因此如果GC不采取任何操作,内存将会满! (GC在范围结束后将其删除)因此在长代码块中,将使用的内存占用更长时间!

答案 2 :(得分:0)

在性能方面,很明显,第二个循环更好,因为你只创建一个对象,然后在循环中添加项目。

但是在第一个循环中,参数变量没有用,因为在for的结尾它不再存在...

同样在第二个循环中你有同样的问题......如果该引用不可用那么......