C#效率優化(4)-- 編譯器對數組遍歷的優化


  在平時開發過程中,數組是我們使用頻率最高的類型之一,在使用定長列表時,數組可以說是最佳方案,這也是我們最熟悉的數據結構之一。

  在C#中使用數組,可以獲取在內存上連續的相同類型的一組變量,在連續訪問時可以滿足CPU訪問寄存器的時間局部性和空間局部性,大大提高了對大量數據的訪問效率,但是在使用它時我們依然有一些需要注意的地方。

  在對編譯時類型為數組類型的對象進行foreach循環時,編譯器會將該foreach循環優化為for循環,從而減少了迭代器的構造和其帶來的額外消耗。但是,如果我們對編譯時類型為IEnumerable類型、運行時類型為數組類型的對象進行foreach循環時,編譯器並不會進行上面的優化,因為編譯器並不知道該對象一定為數組類型,因此沒有辦法進行優化。

  對於下面的代碼:

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;
}

  對編譯時類型為數組類型的ints變量進行遍歷時,生成的IL代碼為:

  

    可以看到其對數組的foreach循環進行了for循環優化,而編譯時類型為IEnumerable類型的enumerables變量進行遍歷時,生成的IL代碼為:

  

  這里並沒有對其進行任何的優化,使用構造迭代器的方式進行循環。

  因此,在對數組類型的對象進行foreach遍歷時,在必要時需要確保其編譯時類型即為數組類型,確保其編譯器優化被使用。

 


如果您覺得閱讀本文對您有幫助,請點一下“推薦”按鈕,您的認可是我寫作的最大動力!

作者:Minotauros
出處:https://www.cnblogs.com/minotauros/

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM