|
在平時(shí)開發(fā)過程中,數(shù)組是我們使用頻率最高的類型之一,在使用定長列表時(shí),數(shù)組可以說是最佳方案,這也是我們最熟悉的數(shù)據(jù)結(jié)構(gòu)之一。 在C#中使用數(shù)組,可以獲取在內(nèi)存上連續(xù)的相同類型的一組變量,在連續(xù)訪問時(shí)可以滿足CPU訪問寄存器的時(shí)間局部性和空間局部性,大大提高了對(duì)大量數(shù)據(jù)的訪問效率,但是在使用它時(shí)我們依然有一些需要注意的地方。 在對(duì)編譯時(shí)類型為數(shù)組類型的對(duì)象進(jìn)行foreach循環(huán)時(shí),編譯器會(huì)將該foreach循環(huán)優(yōu)化為for循環(huán),從而減少了迭代器的構(gòu)造和其帶來的額外消耗。但是,如果我們對(duì)編譯時(shí)類型為IEnumerable類型、運(yùn)行時(shí)類型為數(shù)組類型的對(duì)象進(jìn)行foreach循環(huán)時(shí),編譯器并不會(huì)進(jìn)行上面的優(yōu)化,因?yàn)榫幾g器并不知道該對(duì)象一定為數(shù)組類型,因此沒有辦法進(jìn)行優(yōu)化。 對(duì)于下面的代碼: int[] ints = new int[10]; int result = 0; foreach (var item in ints) { result += item; } IEnumerable enumerables = ints; foreach (var item in enumerables) { result += (int)item; } 對(duì)編譯時(shí)類型為數(shù)組類型的ints變量進(jìn)行遍歷時(shí),生成的IL代碼為: 可以看到其對(duì)數(shù)組的foreach循環(huán)進(jìn)行了for循環(huán)優(yōu)化,而編譯時(shí)類型為IEnumerable類型的enumerables變量進(jìn)行遍歷時(shí),生成的IL代碼為: 這里并沒有對(duì)其進(jìn)行任何的優(yōu)化,使用構(gòu)造迭代器的方式進(jìn)行循環(huán)。 因此,在對(duì)數(shù)組類型的對(duì)象進(jìn)行foreach遍歷時(shí),在必要時(shí)需要確保其編譯時(shí)類型即為數(shù)組類型,確保其編譯器優(yōu)化被使用。
如果您覺得閱讀本文對(duì)您有幫助,請(qǐng)點(diǎn)一下“推薦”按鈕,您的認(rèn)可是我寫作的最大動(dòng)力! 作者:Minotauros 本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。 |
|
|