如何模拟 JIT 优化代码并查看更改?
How can I simulate JIT optimized code and view the change?
我正在尝试检查是否对带有空块的 while 语句进行了 JIT 优化,因此我尝试 运行 我的代码处于发布模式并从 Visual Studio 的调试中查看代码->Windows->反汇编window。但是我没有看到编译代码有任何变化。我尝试添加一些我希望优化的语句:
bool b = false;
if (b)
{
new Object();
}
但我仍然在反汇编中看到它 window:
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 工具,但我一直看到我的 "junk code"(我希望它被优化掉),也许问题是我没有不要写一个适当的 "junk code" 将被优化掉,如果是这样的话,我很乐意提供一些 JIT 应该优化的更好的代码示例。
我如何添加一些肯定会优化的琐碎代码,然后在反汇编中验证 window 我添加的代码不存在?
该片段不够好,无法重现。充实它:
class Program {
static void Main(string[] args) {
bool b = false;
if (b) {
new object();
}
}
}
产生:
bool b = false;
02390450 ret
这是工作中的极端优化,none 的代码幸存下来。抖动优化器可以判断 b
始终为假,因此它不会生成构造函数调用。死码消除是optimization strategies.
之一
I tried to add some statements that I expect to be optimized
这就是问题所在,您看不到添加的不生成任何代码的语句的任何副作用。那里只有原始代码生成的机器代码。
请注意,反汇编中可见的源注释 window 只有在您使用调试版本时才是准确的。在优化的发布版本中,由于优化器移动和删除代码,它们可能会出现令人困惑的错误。
我正在尝试检查是否对带有空块的 while 语句进行了 JIT 优化,因此我尝试 运行 我的代码处于发布模式并从 Visual Studio 的调试中查看代码->Windows->反汇编window。但是我没有看到编译代码有任何变化。我尝试添加一些我希望优化的语句:
bool b = false;
if (b)
{
new Object();
}
但我仍然在反汇编中看到它 window:
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 工具,但我一直看到我的 "junk code"(我希望它被优化掉),也许问题是我没有不要写一个适当的 "junk code" 将被优化掉,如果是这样的话,我很乐意提供一些 JIT 应该优化的更好的代码示例。
我如何添加一些肯定会优化的琐碎代码,然后在反汇编中验证 window 我添加的代码不存在?
该片段不够好,无法重现。充实它:
class Program {
static void Main(string[] args) {
bool b = false;
if (b) {
new object();
}
}
}
产生:
bool b = false;
02390450 ret
这是工作中的极端优化,none 的代码幸存下来。抖动优化器可以判断 b
始终为假,因此它不会生成构造函数调用。死码消除是optimization strategies.
I tried to add some statements that I expect to be optimized
这就是问题所在,您看不到添加的不生成任何代码的语句的任何副作用。那里只有原始代码生成的机器代码。
请注意,反汇编中可见的源注释 window 只有在您使用调试版本时才是准确的。在优化的发布版本中,由于优化器移动和删除代码,它们可能会出现令人困惑的错误。