在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的結果又怎樣呢

