偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

對比C#中for和foreach循環(huán)的性能

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

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

大家先來看看如下三個循環(huán):

  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());  

這三個循環(huán)是我在看《Effective C#》中看到的,發(fā)現(xiàn)書中說第三個循環(huán)和如下代碼等效,經(jīng)過使用ILDasm.exe工具查看IL代碼發(fā)現(xiàn)這個說法并不正確:

  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();  

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

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

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

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

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

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

【編輯推薦】

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

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集合數(shù)組

2020-10-16 08:30:00

foreach編程語言C#

2024-03-11 01:00:00

jsfor循環(huán)

2009-06-19 09:36:27

C#執(zhí)行速度IronPython

2011-06-09 09:08:00

C#循環(huán)結(jié)構(gòu)

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循環(huán)

2024-03-19 14:41:08

C#操作符開發(fā)

2024-12-23 07:38:20

2009-08-28 16:37:32

C# for循環(huán)

2024-10-07 08:37:32

線程池C#管理機制

2014-03-27 11:34:09

C#優(yōu)化性能優(yōu)化

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技術(shù)棧公眾號