Chinaunix首页 | 论坛 | 博客
  • 博客访问: 869138
  • 博文数量: 366
  • 博客积分: 10267
  • 博客等级: 上将
  • 技术积分: 4290
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-24 14:04
文章分类

全部博文(366)

文章存档

2012年(366)

分类: 系统运维

2012-03-10 19:46:09

在c#中通过foreach遍历一个列表是经常拿用的方法,使用起来也方便,性能上也和for没有多大的差别;那为什么还要注意呢?我们先下来看下以下这句话:分配的内存数量和完成测试所需的时间之间有直接关系。当我们单独查看的时候,内存分配并不是非常昂贵。但是,当内存系统只是偶尔清理不使用的内存时,问题就出现了,并且问题出现的频率和要分配的内存数量成正比。因此,你分配越多的内存,对内存进行垃圾回收的频率就越频繁,你的代码性能就会变得越差。

从上面那些话可以看到内存的回收是非常损耗资源,那我们再看下一些.net内部类型的实现。

Array:

1
2
3
4
5
6
7
8
9
10
// System.Array
public IEnumerator GetEnumerator()
{
int lowerBound = this.GetLowerBound(0);
if (this.Rank == 1 && lowerBound == 0)
{
return new Array.SZArrayEnumerator(this);
}
return new Array.ArrayEnumerator(this, lowerBound, this.Length);
}
List:
1
2
3
4
5
// System.Collections.Generic.List
public List.Enumerator GetEnumerator()
{
return new List.Enumerator(this);
}
Dictionary
1
2
3
4
5
// System.Collections.Generic.Dictionary
public Dictionary.Enumerator GetEnumerator()
{
return new Dictionary.Enumerator(this, 2);
}
从以上代码来看,我们再进行foreach操作以上对象的时候都会构建一个Enumerator;也许有人会认为这点东西不需要计较,不过的确很多情况是不用关心;但如果通过内存分析到到的结果表明构建Enumerator的数量排在前几位,那就真的要关心一下了。很简单的一个应用假设你的应用要处理几W的并发,而每次都存在几次foreach那你就能计算出有多少对象的产生和回收?看下一个简单的分析图,这里紧紧是存在一个List'1如果组件内部每个并发多几个foreach又会怎样?

改成for的结果又怎样呢

阅读(400) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~