C# · 12月 27, 2021

c# – 字段与属性的实际性能

我正在做一些后期建立的CIL编织,将CIL添加到程序集中的所有方法(换句话说,吨的方法).每个方法检查特定值是否为空.示例(C#反射器版本的CIL代码): // CIL woven region startif (MyType.something == null) { // … some new stuff}// CIL woven region end

将MyType.something作为属性与字段的性能影响是什么?我知道我读过C#编译器执行特殊的优化,在这种情况下应该没有性能影响…但是直接的CIL代码(没有C#编译器)的情况呢?还是JIT编译器允许这些优化(所以直接的CIL代码还是有好处的)?

将会为静态属性的访问者发出OpCode.Call的性能比Ldsfld的性能更差(考虑到这是由成千上万的调用引起的,因为程序集中的每个方法都是编织的)?

谢谢.

解决方法 在开发SlimDX的数学库时,我们发现,在.NET 3.5 SP1框架下,使用数学类型成员的字段(如X,Y,Z为Vector3),与性能相比,性能提升不成比例.换句话说,对于大量访问属性的小数学函数,差异是显着的.

自从.NET 3.5 SP1(见JIT inling)以来,这一点得到了改进.虽然我相信之前的JIT仍将内联小型方法(属性完全是简单的方法),但是在早期的框架中存在一个错误,它阻止了内置使用或返回值类型的方法.

请注意,当时的差异还是很小的.我仍然会选择使用属性,除了最具性能的关键情况.