如何模拟JIT优化代码并查看更改?

时间:2017-10-16 12:11:58

标签: c# optimization jit disassembly

我试图检查带有空块的while语句是否正在进行JIT优化,因此我尝试在发布模式下运行我的代码并从Visual Studio的Debug-> Windows-查看代码>反汇编窗口。但是,我没有看到编译代码的任何变化。我试图添加一些我希望优化的语句:

  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应优化的更好的代码示例感到高兴。

如何添加一些可以优化的简单代码,然后在该反汇编窗口中验证我添加的代码不存在?

1 个答案:

答案 0 :(得分: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之一。

  

我尝试添加一些我期望优化的语句

这就是问题所在,您无法看到任何不产生任何代码的已添加语句的副作用。所有这些都是由原始代码生成的机器代码。

请注意,在“反汇编”窗口中可见的源注释仅在使用“调试”构建时才是准确的。在优化的版本构建中,由于优化器移动和删除代码,它们会变得非常令人困惑。