成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

對比C#中for和foreach循環的性能

開發 后端
在C#中有for和foreach循環,對于for循環大家還是比較了解,那么foreach循環呢?這里為大家比較一下二者的性能差別。

筆者在看了《Effective C#》了解到foreach循環,使用foreach循環語句,它會編譯為不同的代碼,自動將每一個操作數強制轉換為正確的類型。

大家先來看看如下三個循環:

  1. int[] foo = new int[100];  
  2.  1,  foreach (int i in foo)  
  3. Console.WriteLine(i.ToString());  
  4. 2,for(int index=0;index                Console.WriteLine(foo[index].ToString());  
  5. 3,int len=foo.Length;  
  6. for(int index=0;index                Console.WriteLine(foo[index].ToString());  

這三個循環是我在看《Effective C#》中看到的,發現書中說第三個循環和如下代碼等效,經過使用ILDasm.exe工具查看IL代碼發現這個說法并不正確:

  1. int len=foo.Length;  
  2. for(int index=0;index   
  3. {  
  4.      if(index   
  5.           Console.WriteLine(foo[index].ToString());  
  6.       else 
  7.             throw new IndexOutOfRangeException();  

書中的看法是數組的邊界測試會被執行兩次(編譯器生成的代碼一次,JIT編譯階段還要執行一次檢查),但是的確沒有在IL代碼中發現C#的編譯器生成類似的邏輯,所以這個說法有問題!

一般C++轉過來的程序員都很喜歡這樣寫循環,認為這樣就不會每一次循環都計算一次Length屬性的值了,可以帶來性能上的提升!經查看IL代碼,實際情況也就是如此!

但是,這樣寫會帶來另外的問題,那就是破壞了JIT對代碼的進行的優化,這樣的寫法在每一次循環中都要做數組的邊界檢查,這樣也帶來了性能上的損失,而且這個損失要比每次計算Length要大,如果我們按第二種寫法,JIT只在第一次循環之前檢查一次數組界限(JIT這種優化只針對f循環中訪問一維0基數組,并且索引是0和Length之間的元素)

看來JIT不喜歡我們這樣幫助他優化代碼,這樣反而破壞了JIT本身的優化!

我們再來看看第一種寫法和第二種寫法,通過查看IL代碼,他們生成的代碼比較類似,差別是使用foreach循環是把數組元素放到i變量里!

C#編譯器對第一種寫法(使用foreach循環)針對數組做了特殊的處理,并沒有像其他集合那樣在內部使用迭代器,這里如果使用迭代器的話會導致裝箱和拆箱操作,這樣會帶來性能上的損失!看來C#編譯器總是可以為foreach生成很高效率的代碼,而且可以帶來很多其他的好處,例如簡化代碼的編寫,或是將來把foo變成其他集合 而foreach循環不必修改(使用for循環必須修改代碼),操作數強制類型轉換等.

【編輯推薦】

  1. C#字符ASCII碼學習經驗
  2. C#數值類型之間的轉換概述
  3. 日期型數據轉換成C#長整型數據
  4. C#查看Excel對象模型分析
  5. C#日期型數據簡單剖析
責任編輯:彭凡 來源: 博客園
相關推薦

2009-08-18 14:14:45

C#擴展方法性能測試

2009-07-31 18:39:31

C#中foreach引

2025-05-08 08:10:53

2022-08-27 14:42:45

Java集合數組

2020-10-16 08:30:00

foreach編程語言C#

2024-03-11 01:00:00

jsfor循環

2009-06-19 09:36:27

C#執行速度IronPython

2011-06-09 09:08:00

C#循環結構

2009-09-17 18:56:22

CLR Via C#

2015-04-01 14:34:37

C#dynamicDictionary性

2021-10-14 07:55:17

提示技巧C#

2024-08-30 08:43:24

JavaScriptforEachfor循環

2024-03-19 14:41:08

C#操作符開發

2024-12-23 07:38:20

2009-08-28 16:37:32

C# for循環

2024-10-07 08:37:32

線程池C#管理機制

2014-03-27 11:34:09

C#優化性能優化

2009-08-03 18:35:02

Boxing和UnboC#

2011-06-17 16:42:23

C#

2024-10-05 00:00:35

Action?C#Func?
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久蜜桃一区二区人 | 国产精品视频免费播放 | 日韩在线播放中文字幕 | 欧美三区在线观看 | 性视频一区 | 欧美福利在线 | 国产欧美日韩久久久 | 97色在线视频 | 亚洲一级淫片 | 成人亚洲精品 | 亚洲第一女人av | 国产精品揄拍一区二区久久国内亚洲精 | 国产精品久久久久久久久久三级 | 999www视频免费观看 | 免费国产视频 | 亚州影院 | 亚洲福利在线观看 | 久久精品二区亚洲w码 | 蜜桃精品视频在线 | 一区二区三区免费在线观看 | 老牛嫩草一区二区三区av | 国产成人在线观看免费 | 国产精品成人在线播放 | 国产激情福利 | 亚洲精品一区二 | 色妹子综合网 | 中文字幕二区三区 | 在线天堂免费中文字幕视频 | 亚洲精品久久久久久久久久久 | 欧美日韩电影一区二区 | www.日本在线| 国产高清美女一级a毛片久久w | 国产精品永久在线观看 | 欧美三级网站 | 日韩一二区 | 久久999 | 91原创视频| 国产视频1区 | 中文字幕亚洲视频 | 国产精品久久久久无码av | 人人叉|