最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# 循環(huán)判斷會(huì)進(jìn)來(lái)幾次的實(shí)現(xiàn)代碼

 更新時(shí)間:2018年06月19日 10:02:07   作者:lindexi  
這篇文章主要介紹了C# 循環(huán)判斷會(huì)進(jìn)來(lái)幾次的實(shí)現(xiàn)代碼,代碼中就一個(gè)循環(huán),循環(huán)的判斷是從一個(gè)函數(shù)獲取值,需要的朋友可以參考下

最近有小伙伴告訴我,在循環(huán)的判斷條件只會(huì)計(jì)算一次,本金魚不相信,于是就做了測(cè)試,本文記錄我做的測(cè)試。

先來(lái)寫一個(gè)簡(jiǎn)單的代碼, 就一個(gè)循環(huán),循環(huán)的判斷是從一個(gè)函數(shù)獲取值

class Program
  {
    static void Main(string[] args)
    {
      var meepeMorcear = new MeepeMorcear();
      meepeMorcear.BirmeruLerrayjairbay();
    }
  }
  class MeepeMorcear
  {
    public void BirmeruLerrayjairbay()
    {
      for (int i = 0; i < DaydrearNenawerlai(); i++)
      {
        Console.WriteLine("第" +i.ToString()+"個(gè)逗比");
      }
    }
    public int DaydrearNenawerlai()
    {
      Console.WriteLine("進(jìn)入");
      return 10;
    }
  }

通過(guò) Main 調(diào)用 BirmeruLerrayjairbay ,這個(gè)函數(shù)里面的 for 判斷是 DaydrearNenawerlai 拿到一個(gè)值,我嘗試在 release 運(yùn)行,結(jié)果每個(gè)判斷都需要進(jìn)入 DaydrearNenawerlai 函數(shù),請(qǐng)看輸出

進(jìn)入
第0個(gè)逗比
進(jìn)入
第1個(gè)逗比
進(jìn)入
第2個(gè)逗比
進(jìn)入
第3個(gè)逗比
進(jìn)入
第4個(gè)逗比
進(jìn)入
第5個(gè)逗比
進(jìn)入
第6個(gè)逗比
進(jìn)入
第7個(gè)逗比
進(jìn)入
第8個(gè)逗比
進(jìn)入
第9個(gè)逗比

也就是在 Debug 或 Release 下,for 里面的判斷都是需要執(zhí)行,所以在 for 里的判斷如果寫了很長(zhǎng)的計(jì)算,那么就會(huì)在每次循環(huán)都需要重新計(jì)算。即使每次計(jì)算出來(lái)的值都是一樣,也需要重新計(jì)算。

所以這樣看起來(lái)性能不如這樣寫,使用一個(gè)臨時(shí)的變量獲取判斷的值

public void BirmeruLerrayjairbay()
    {
      var mowraiTepalor = DaydrearNenawerlai();
      for (int i = 0; i < mowraiTepalor; i++)
      {
        Console.WriteLine("第" +i.ToString()+"個(gè)逗比");
      }
    }

但是很快,另一個(gè)小伙伴告訴我,你把輸出去掉,然后使用斷點(diǎn),你再看看

 

我添加了斷點(diǎn),在斷點(diǎn)輸出 123 然后運(yùn)行

 

這時(shí)我發(fā)現(xiàn)運(yùn)行沒(méi)有輸出 123 也就是函數(shù)沒(méi)有進(jìn)來(lái),我再次添加斷點(diǎn),跟著函數(shù)也沒(méi)有訪問(wèn)

所以這時(shí)的 DaydrearNenawerlai 函數(shù)就被優(yōu)化掉了

我和一個(gè)小伙伴說(shuō)了這個(gè)問(wèn)題,他說(shuō)是被 IL 優(yōu)化了,我一點(diǎn)不相信,所以我就去看 IL 代碼

從下面的代碼

public void BirmeruLerrayjairbay()
    {
      for (int i = 0; i < DaydrearNenawerlai(); i++)
      {
        Console.WriteLine("第" +i.ToString()+"個(gè)逗比");
      }
    }
    /// <summary>
    /// 進(jìn)入lindexi.github.io可以看到更多博客
    /// </summary>
    /// <returns></returns>
    public static int DaydrearNenawerlai()
    {
      return 10;
    }

轉(zhuǎn) IL 可以看到下面代碼,我會(huì)在 IL 添加很多注釋,所以很容易看懂。

.method public hidebysig instance void 
  BirmeruLerrayjairbay() cil managed 
 {
  .maxstack 3
  .locals init (
   [0] int32 i
  )
  // 第 23 行 18 個(gè)字符到 27 個(gè)字符
  // [23 18 - 23 27]
  IL_0000: ldc.i4.0 
  // 定義 i ,代碼的 int i = 0;  
  IL_0001: stloc.0   // i
  IL_0002: br.s     IL_0023
  // 這里就是進(jìn)入循環(huán) for ,在 IL 不管 for 還是 while 都是差不多
  // start of loop, entry point: IL_0023
   // [25 17 - 25 60]
   // 下面這個(gè)代碼就是 Console.WriteLine("第" +i.ToString()+"個(gè)逗比"); 從代碼可以看到
   // 需要先申請(qǐng)"第"
   IL_0004: ldstr    "第"
   // 然后把 i 放入棧
   IL_0009: ldloca.s   i
   // 調(diào)用 int.ToString ,使用的是實(shí)例的方法
   IL_000b: call     instance string [mscorlib]System.Int32::ToString()
   // 把"個(gè)逗比"放入棧
   IL_0010: ldstr    "個(gè)逗比"
   // 調(diào)用字符串組合方法,組合三個(gè)字符串,返回一個(gè)字符串。
   // 把剛才入棧三個(gè)字符串出棧,返回的字符串入棧
   IL_0015: call     string [mscorlib]System.String::Concat(string, string, string)
   // 調(diào)用 Console.WriteLine ,從棧拿到一個(gè)字符串輸出
   IL_001a: call     void [mscorlib]System.Console::WriteLine(string)
   // 下面是 i++ 代碼
   // [23 55 - 23 58]
   // 將指定索引處的局部變量加載到計(jì)算堆棧上,這里的索引是 0 ,在代碼的變量是 i 所以把 i 加載到計(jì)算堆棧
   IL_001f: ldloc.0   // i
   // 將整數(shù)值 1 作為 int32 推送到計(jì)算堆棧上
   IL_0020: ldc.i4.1   
   // 從堆棧出棧兩個(gè)數(shù)值進(jìn)行相加,返回的值放在棧
   IL_0021: add     
   // 從計(jì)算堆棧的頂部彈出當(dāng)前值并將其存儲(chǔ)到指定索引處的局部變量列表中,這里索引是 0 ,在代碼的變量是 i ,所以 i = i + 1 的代碼就是這樣做
   IL_0022: stloc.0   // i
   // 從堆棧加載 i ,把 i 入棧
   // [23 29 - 23 53]
   IL_0023: ldloc.0   // i
   // 調(diào)用方法 DaydrearNenawerlai 拿到返回值
   IL_0024: call     int32 MuhoubearWhedoofi.MeepeMorcear::DaydrearNenawerlai()
   // 如果第一個(gè)值小于第二個(gè)值,則將控制轉(zhuǎn)移到目標(biāo)指令,這里的第一個(gè)值就是 i ,第二個(gè)值就是 DaydrearNenawerlai 的返回值。跳轉(zhuǎn)到標(biāo)簽 IL_0004 ,如果沒(méi)有小于,就繼續(xù)代碼。
   IL_0029: blt.s    IL_0004
  // end of loop
  // [27 9 - 27 10]
  IL_002b: ret     
 } // end of method MeepeMorcear::BirmeruLerrayjairbay
 .method public hidebysig static int32 
  DaydrearNenawerlai() cil managed 
 {
  .maxstack 8
  // 把一個(gè)值 放入堆棧,放入的是 10 ,然后從棧拿到值返回
  // [36 13 - 36 23]
  IL_0000: ldc.i4.s   10 // 0x0a
  IL_0002: ret     
 } // end of method MeepeMorcear::DaydrearNenawerlai

從上面代碼可以發(fā)現(xiàn),實(shí)際 DaydrearNenawerlai 沒(méi)有被優(yōu)化掉,還是有這個(gè)方法。

總結(jié)

以上所述是小編給大家介紹的C# 循環(huán)判斷會(huì)進(jìn)來(lái)幾次的實(shí)現(xiàn)代碼,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

最新評(píng)論

荥经县| 阳谷县| 新化县| 涿州市| 锦州市| 饶平县| 蓬溪县| 黎平县| 融水| 嘉荫县| 昆山市| 九台市| 衡水市| 巴彦淖尔市| 夏河县| 尼勒克县| 依安县| 饶阳县| 台江县| 浦县| 嘉峪关市| 新营市| 长岭县| 乌兰察布市| 乌什县| 类乌齐县| 青海省| 灵川县| 枝江市| 阳谷县| 巴楚县| 延川县| 万源市| 文成县| 沙洋县| 英吉沙县| 巫山县| 巫溪县| 施甸县| 衡东县| 临海市|