日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
對(duì)比C#中for和foreach循環(huán)的性能

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

目前創(chuàng)新互聯(lián)公司已為超過(guò)千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、網(wǎng)站運(yùn)營(yíng)、企業(yè)網(wǎng)站設(shè)計(jì)、西崗網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶(hù)導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶(hù)和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

大家先來(lái)看看如下三個(gè)循環(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());  

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

 
 
 
  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ū)中的看法是數(shù)組的邊界測(cè)試會(huì)被執(zhí)行兩次(編譯器生成的代碼一次,JIT編譯階段還要執(zhí)行一次檢查),但是的確沒(méi)有在IL代碼中發(fā)現(xiàn)C#的編譯器生成類(lèi)似的邏輯,所以這個(gè)說(shuō)法有問(wèn)題!

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

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

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

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

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


分享文章:對(duì)比C#中for和foreach循環(huán)的性能
文章URL:http://www.5511xx.com/article/coehgds.html