gpt4 book ai didi

c# - 为什么 .NET JIT 编译器决定不内联或优化对没有副作用的空静态方法的调用?

转载 作者:IT王子 更新时间:2023-10-29 04:19:12 31 4
gpt4 key购买 nike

我想我观察到 .NET JIT 编译器没有内联或优化对没有副作用的空静态方法的调用,考虑到一些定制的在线资源,这有点令人惊讶。

我的环境是 Visual Studio 2013 on x64、Windows 8.1、.NET Framework 4.5。

给定这个简单的测试程序 ( https://ideone.com/2BRCpC )

class Program
{
static void EmptyBody()
{
}

static void Main()
{
EmptyBody();
}
}

对上述程序进行优化的发布版本为 MainEmptyBody 生成以下 MSIL:

.method private hidebysig static void  Main() cil managed
{
.entrypoint
// Code size 6 (0x6)
.maxstack 8
IL_0000: call void Program::EmptyBody()
IL_0005: ret
} // end of method Program::Main

.method private hidebysig static void EmptyBody() cil managed
{
// Code size 1 (0x1)
.maxstack 8
IL_0000: ret
} // end of method Program::EmptyBody

毫不奇怪,MSIL 包含从 MainEmptyBody 的调用,因为 C# 编译器不会像那样内联或优化调用。但是,我认为 JIT 编译器随后会内联或优化该调用。但这似乎并没有发生。

如果我运行上面的程序并进入 Main 中的调试器,生成的程序集是这样的:

00572621  mov         ebp,esp  
00572623 cmp dword ptr ds:[4320B84h],0
0057262A je 00572631
0057262C call 73E6AF20
00572631 call dword ptr ds:[4321578h]

指令指针立即设置为 00572631 处的最后一行,这是对 EmptyBody 的调用。步入EmptyBody,发现生成的程序集是

00BD2651  mov         ebp,esp  
00BD2653 cmp dword ptr ds:[4B00B84h],0
00BD265A je 00BD2661
00BD265C call 73E6AF20
00BD2661 nop
00BD2662 pop ebp
00BD2663 ret

指令指针立即设置到 00BD2661 处的 nop 行,它没有做任何事情,我猜不出它为什么首先生成。

鉴于上面的两个汇编片段共享相同的 4 指令 header ,我假设这只是设置堆栈等的常规方法入口样板。不过,我很想知道这些重复出现的指令会做什么:

00BD2653  cmp         dword ptr ds:[4B00B84h],0  
00BD265A je 00BD2661
00BD265C call 73E6AF20

无论如何,主要问题是:为什么 JIT 编译器会生成调用空体静态方法 EmptyBody 的程序集?

最佳答案

进一步挖掘后,事实证明我可以自己回答这个问题。如 http://blogs.msdn.com/b/vancem/archive/2006/02/20/535807.aspx 所述, 在调试器下观察优化发布版本的反汇编将默认影响 JIT 编译器。

取消选中这些

  • “抑制模块加载的 JIT 优化”
  • “只启用我的代码”

在 VS > Tools > Debugging > General 下,将显示“真实的”JIT 编译结果,在我上面的 Main 中调用 EmptyBody 是这样的:

004C2620  ret

这意味着对 EmptyBody 的调用被完全移除,这是预期的结果,世界仍然是一个快乐且可以预见的居住地:)

关于c# - 为什么 .NET JIT 编译器决定不内联或优化对没有副作用的空静态方法的调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22892766/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com