C#内联属性吗?

时间:2009-03-14 21:29:54

标签: c# .net optimization clr

C#是否内联访问属性?我知道内联的JIT有32字节(指令?)限制,但它是内联属性还是方法调用?

4 个答案:

答案 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位不执行,也不执行任何其他非静态方法。