[課後筆記] 撰寫高效率 .Net Code - JIT Inlining

.Net 課程公益活動 - 撰寫高效率 .Net Code
筆記 - JIT Inlining

前言

JIT 原來也會影響程式的效率...就來實作筆記一下囉

JIT (Just-In-Time)

直接看圖 出處 https://commons.wikimedia.org/wiki/File:Compile.PNG

c# 編譯成 IL Code 還會透過 JIT 轉成給電腦看的Native Code

JIT 在轉換Native Code的時候 會改變我們的程式
Inlining 就是一項
大概解釋就是如果程式碼如下
public void Boo()
{
   Do();
}
private void Do()
{
   var a = 100 / 10;
}

透過JIT會變成
public void Boo()
{
   var a = 100 / 10;
}


但是不是每個都會這樣做 當某些情況下就不會
例如 有 IF
更詳細的內容 請看Method Inlining

實驗

直接看程式碼

public class JITController : ApiController
{
    [HttpGet]
    public IHttpActionResult Get()
    {
        var f = new Foo();
        f.Boo();
        return Ok();
    }
}
public class Foo
{
    public void Boo()
    {
        Do();
    }
    private void Do()
    {
        var a = 0;
        var b = 1 / a;
    }      
}

先用Debug模式 - 錯誤訊息
再用Release模式 - 錯誤訊息
發現到不一樣的地方嗎
Release 只看的見Get 了 
我想應該就是 JIT Inlining 把程式碼改變了
不讓JIT Inlining 作用的方法

1.單獨方法設定 - 掛[MethodImpl(MethodImplOptions.NoInlining)]Release模式 - 錯誤訊息
看到Do可以被抓到了 不過Boo 還是沒有出現
對照程式碼 我只有在Do上掛 NoInlining 所以我的假設應該沒錯

2. 如果整個都不想要   (不知道何時會用到)
工具 -> 選項 -> 偵錯 -> 一般 打勾 

結語

這知識應該有一天會救我在某個坑裡吧

如果內容有誤請多鞭策謝謝