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

C# 如何模拟JIT优化的代码并查看更改?,c#,optimization,jit,disassembly,C#,Optimization,Jit,Disassembly,我试图检查带有空块的while语句是否正在进行JIT优化,因此我尝试在发布模式下运行代码,并从VisualStudio的调试->窗口->反汇编窗口查看代码。但是,我没有看到编译代码有任何变化。我试图添加一些我希望优化的语句: bool b = false; if (b) { new Object(); } 但我仍然在拆解窗口中看到:

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

  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();
                        }
我还尝试了一个上提到的NGen工具,但我一直看到我的“垃圾代码”(我希望它会被优化掉),也许问题是我没有编写一个适当的“垃圾代码”来优化掉,如果是这样的话,我很高兴看到JIT应该优化的更好的代码示例


我怎样才能添加一些简单的代码,这些代码肯定会得到优化,然后在反汇编窗口中验证我添加的代码是否不存在?

代码片段不够好,无法重新编译。充实一下:

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

            bool b = false;
02390450  ret  
这是工作中的极端优化,没有一个代码幸存下来。抖动优化器可以判断
b
始终为false,因此它不需要麻烦地生成构造函数调用。死代码消除是其中的一种

我试图添加一些我希望优化的语句

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


请注意,只有在使用调试生成时,反汇编窗口中可见的源注释才是准确的。在优化的发布版本中,由于优化器移动和删除代码,他们可能会犯相当令人困惑的错误。

确保您阅读了所有问题的答案,而不仅仅是已接受的答案one@Evk-您的意思是取消选中“在模块加载时抑制JIT优化”和“仅启用我的代码”吗?我已经这么做了。所以没有重复问题的答案可以帮助你解决问题?@Evk-不幸的是没有。我也尝试过其他答案中提到的Ngen工具,但我一直看到我的“垃圾代码”(我希望它会被优化掉),也许问题是我无法编写一个适当的“垃圾代码”来优化掉,如果是这样的话,我很乐意为JIT应该优化的代码提供更好的示例。@CodeCaster-我试图编辑我的问题,指出为什么它不是dup,你能重新打开它吗(如果你认为在我编辑后它合适的话)?当我将你的代码复制到一个新的小型控制台应用程序时,我发现你是正确的,并且它已经优化。当我试图嵌入
bool b=false;如果(b){new object();}
part到我的大型实际应用程序中(并在启用发布配置和优化的情况下运行),死代码并没有被消除。我不明白为什么?你仍然没有抓住要点,你问题中的机器代码都不是由添加的代码生成的。没有添加代码。我们看不到出现在它前面的语句,但我猜是一个使用条件运算符的表达式。这种非常密集的表达式,当抖动需要从优化的代码生成调试器信息时,会让人头痛不已。这就是源注释出现在错误位置的原因。请始终记住,调试信息对于版本构建代码来说是非常不完美的,这正是调试配置存在的原因。