小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

C#效率優(yōu)化(4)-- 編譯器對(duì)數(shù)組遍歷的優(yōu)化

 路人甲Java 2020-04-25

  在平時(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
出處:https://www.cnblogs.com/minotauros/

本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多