C#是否内联访问属性?我知道内联的JIT有32字节(指令?)限制,但它是内联属性还是纯方法调用?
答案 0 :(得分:24)
由JIT决定(据我所知,C#编译器不进行任何内联),但我相信JIT会在大多数情况下内联琐碎的属性。
请注意,不会内联MarshalByRefObject
类型的成员,其中包含System.Windows.Forms.Control
(通过System.ComponentModel.Component
)。
我也看到double
字段在通过属性访问时效率较低 - 可能是因为存在一些细微之处(由于寄存器使用等)。
另请注意,64位和32位JIT是不同的,包括对内联内容的处理。
编辑:我刚刚在David Notario找到了2004 blog entry并提供了更多信息。然而,那是在2.0发布之前 - 我不会惊讶地发现它至少某些现在已经改变了。反正可能会引起人们的兴趣。编辑:Another question提到2008 Vance Morrison blog entry,它提供了更多信息。有趣的东西。
答案 1 :(得分:8)
属性访问 只是一个纯方法调用。编译器为属性访问和具有类似签名的方法调用发出的IL没有区别,这可以回答你的问题。
答案 2 :(得分:5)
我花了一段时间才弄清楚在Visual Studio中你可以查看托管代码的反汇编,在之后JIT编译它。
那么为什么不创建一个具有非常简单的访问器属性的类,在发布模式下运行它,设置一个断点,看看反汇编说的是什么?
答案 3 :(得分:4)
我最近发布了一个类似的问题:
Why are public fields faster than properties?
我的问题是公共字段比属性更快,因为我正在运行64位Vista,JIT也将我的代码编译为64位,我的属性不内衬。强制项目编译为x86在内联属性,并且属性和公共字段之间没有速度差异。
因此,C#32位JIT执行内联属性,64位不执行,也不执行任何其他非静态方法。