.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. 如果整個都不想要 (不知道何時會用到)
工具 -> 選項 -> 偵錯 -> 一般 打勾
結語
這知識應該有一天會救我在某個坑裡吧
如果內容有誤請多鞭策謝謝