2017-10-16 81 views
1

我想檢查是否有空塊的while語句被JIT優化,所以我嘗試在發佈模式下運行我的代碼,並從Visual Studio的Debug-> Windows-> Disassembly窗口查看代碼。但是,我沒有看到編譯代碼的任何改變。我嘗試添加一些語句,我希望進行優化:如何模擬JIT優化代碼並查看更改?

bool b = false; 
    if (b) 
         { 
          new Object(); 
         } 

,但我仍然可以看到它的反彙編窗口上:

     bool b = false; 
         if (b) 
         { 
0524A8FF mov   ecx,dword ptr [ebx+0Ch] 
0524A902 push  dword ptr ds:[33422A0h] 
0524A908 mov   edx,esi 
0524A90A cmp   dword ptr [ecx],ecx 
0524A90C call  71DE3490 
0524A911 test  eax,eax 
0524A913 je   0524A97C 
0524A915 mov   ecx,51DEAC4h 
0524A91A call  002E30F4 
0524A91F mov   edi,eax 
0524A921 lea   edx,[edi+8] 
0524A924 call  72D12410 
          new Object(); 
         } 

我也試圖與上一個related question提到NGEN工具,但我一直看到我的「垃圾代碼」(我希望能夠優化),也許問題是我不寫一個合適的「垃圾代碼」,這將被優化,如果這是我的情況,我會很高興這是JIT應該優化的一些更好的代碼示例。

如何添加一些可以確保優化的簡單代碼,然後在反彙編窗口中驗證我添加的代碼不存在?

+0

請務必閱讀重複問題的所有ansewers,不只是接受一個 – Evk

+0

@Evk - 你的意思是取消「禁止在模塊加載JIT優化」和「啓用僅我的代碼」?我已經這樣做了。 – BornToCode

+0

所以沒有重複問題的答案可以幫助您解決問題? – Evk

回答

2

該代碼片段不足以獲得repro。充實一下:

class Program { 
    static void Main(string[] args) { 
     bool b = false; 
     if (b) { 
      new object(); 
     } 
    } 
} 

產地:

  bool b = false; 
02390450 ret 

也就是說在工作極端優化,沒有任何代碼的存活。抖動優化器可以知道b始終爲false,因此不會產生構造函數調用。死碼消除是optimization strategies之一。

我嘗試添加一些語句,我期望能夠優化

這是問題,你不能看到,不產生任何代碼添加語句任何副作用。所有這些都是由原始代碼生成的機器代碼。

請注意,在使用調試版本時,在「反彙編」窗口中可見的源註釋僅爲準確。在優化版本構建中,由於優化器移動和刪除代碼,它們可能會變得非常令人困惑。

+0

當我將你的代碼複製到一個新的小控制檯應用程序時,我看到你是正確的,並且它已經過優化。當我試圖嵌入'bool b = false; (b){ new object();我的大實際應用程序(並運行它與發佈配置,優化啓用)的一部分,死碼沒有被消除。我不明白爲什麼? – BornToCode

+1

您仍然錯過了這個觀點,您的問題中沒有機器代碼是由附加代碼生成的。沒有添加代碼。我們無法看到之前出現的語句,但我猜想使用條件運算符的表達式。當需要從優化的代碼生成調試器信息時,這種非常密集的表達會給抖動帶來跳動頭痛。這就是爲什麼源註釋出現在錯誤的地方。請始終記住,對於發佈構建的代碼來說,調試信息是非常不完善的,這正是調試配置完全存在的原因。 –