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仍然会内联小方法(属性毕竟只是方法),但早期框架中存在一个错误,它阻止了内联或返回值类型的方法.
请注意,差异在那里仍然很小.除了性能最关键的情况外,我仍然会选择使用属性.
C#编译器不会对此进行优化,不是-但据我所知,JIT编译器通常可以内联琐碎(非虚拟)属性。
与所有性能问题一样:如有疑问,请进行测试!
| 归档时间: |
|
| 查看次数: |
3456 次 |
| 最近记录: |