简单的基本问题
本文关键字:问题 简单 | 更新日期: 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语句的末尾它不再存在了…
在第二个循环中也有同样的问题…如果引用不可用....