简单的基本问题

本文关键字:问题 简单 | 更新日期: 2023-09-27 17:52:12

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

下面是我在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");
  }
}

而不是每次都创建dictionary对象我应该在for循环之前创建dictionary对象并对dictionary对象应用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");
  }
}

在这两个选项中,哪一个对性能更好。

谢谢,nil

简单的基本问题

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

有人可能认为清空数据结构比初始化空数据结构要快。情况并非总是如此。请注意,现代语言(c#、Java)的内存管理器针对分配许多小对象进行了优化(这与垃圾收集器的工作方式有关)。在c++中,由于缺乏GC,内存管理器被调优为分配少量大对象。因此,在循环内部重新构造Dictionary与清除Dictionary(性能方面)相当。

而且,clear()不一定释放所有已分配的内存。它可以只重置一些指针/索引。因此,如果你使用clear(),你的Dictionary可能仍然占用大量内存,这可能会减慢你代码的其他部分。

底线:不要担心它,除非一个分析器告诉你这是你程序的瓶颈

如果这两种方法都对你有效,你应该记住两件事:

  • 第一个在每个循环中创建字典对象,所以它的速度较低,因为在每个循环中分配内存次数
  • 第二个更快。但是让Dictionary对象存活更长的时间,所以如果GC对它不采取任何行动,内存将是满的!(GC在作用域结束后删除它)所以在长代码块中,占用更多时间的内存!

简单地说,第二个循环显然更好,因为您只创建了一个对象,然后在循环中添加了项。

然而,在第一个循环中,参数变量是没有用的,因为在for语句的末尾它不再存在了…

在第二个循环中也有同样的问题…如果引用不可用....