c#使用foreach需要知道的

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

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

Array:

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

改成for的结果又怎样呢

访问Beetlex的Github
posted @ 2012-03-10 16:03  beetlex  阅读(16284)  评论(5编辑  收藏  举报