字段与属性的实际性能

Jef*_*eff 9 c# reflection reflection.emit

我正在做一些后期构建CIL编织,它将CIL添加到程序集中的所有方法(换句话说,大量方法).每个方法检查特定值是否为空.示例(C#Reflector'd版本的CIL代码):

// CIL woven region start
if (MyType.Something == null) {
 // ... some new stuff
}
// CIL woven region end
Run Code Online (Sandbox Code Playgroud)

将MyType.Something作为属性与字段的性能影响是什么?我知道我已经读过C#编译器执行特殊的优化,在这种情况下应该没有性能影响......但是在直接CIL代码(没有C#编译器)的情况下......?或者它是允许这些优化的JIT编译器(因此直接CIL代码仍然有益)?

为静态属性的访问器发出OpCode.Call会有比Ldsfld差的性能(请记住,由于程序集中的每个方法都是编织的,因此这涉及成千上万的调用)?

谢谢.

Mik*_*keP 13

在为SlimDX开发数学库时,我们发现,在.NET 3.5 SP1之前的框架中,使用数学类型成员的字段(例如Vector3的X,Y,Z)会对属性产生不成比例的性能提升.换句话说,对于大量访问属性的小数学函数而言,差异是显而易见的.

自从.NET 3.5 SP1以来,这已得到改进(参见JIT inling).虽然我认为之前的JIT仍然会内联小方法(属性毕竟只是方法),但早期框架中存在一个错误,它阻止了内联或返回值类型的方法.

请注意,差异在那里仍然很小.除了性能最关键的情况外,我仍然会选择使用属性.


Jon*_*eet 5

C#编译器不会对此进行优化,不是-但据我所知,JIT编译器通常可以内联琐碎(非虚拟)属性。

与所有性能问题一样:如有疑问,请进行测试!

  • @ JeffN825:我认为如果您可以在实际代码中应用测试并且无法观察到任何差异,那么就足以证明任何差异都是微不足道的:) (2认同)