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