成人免费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循環

2011-06-09 09:08:00

C#循環結構

2009-06-19 09:36:27

C#執行速度IronPython

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-03-19 14:41:08

C#操作符開發

2024-08-30 08:43:24

JavaScriptforEachfor循環

2024-12-23 07:38:20

2009-08-28 16:37:32

C# for循環

2014-03-27 11:34:09

C#優化性能優化

2024-10-07 08:37:32

線程池C#管理機制

2009-08-03 18:35:02

Boxing和UnboC#

2011-06-17 16:42:23

C#

2024-05-30 12:24:03

C#開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品欧美一区二区在线观看欧美熟 | 国产精品一区在线 | 91精品国产91久久综合桃花 | 激情欧美一区二区三区中文字幕 | 亚洲午夜av久久乱码 | 久久久久久国产精品免费免费狐狸 | 天堂色| av黄色免费| 日韩三级 | 精国产品一区二区三区四季综 | 国产日产精品一区二区三区四区 | 成人免费观看视频 | 99久久久久久久久 | 成人性视频免费网站 | 亚洲免费在线 | 精品一区二区久久久久久久网站 | 欧美在线视频网站 | 黄网免费 | 欧美日韩国产一区二区三区 | 久久精品视频免费看 | 亚洲第一在线视频 | 日韩一区二区三区在线 | 亚洲九九精品 | 日韩精品久久久久 | 欧美日韩在线电影 | 日韩成人在线视频 | 亚洲视频一区在线观看 | 久在线视频 | 国产操操操 | 狠狠色综合久久丁香婷婷 | 精品久久久久久红码专区 | 精品国产乱码一区二区三 | 久久精品中文字幕 | 久久最新 | 久久亚洲精品视频 | 国产粉嫩尤物极品99综合精品 | 日本一区二区高清不卡 | h在线播放| 欧美日韩毛片 | 午夜在线免费观看视频 | 亚洲欧美日韩在线一区二区 |