C# 使用“动态”与“对象”的性能成本?
在.NET中使用C# 使用“动态”与“对象”的性能成本?,c#,.net,performance,dynamic,compiler-construction,C#,.net,Performance,Dynamic,Compiler Construction,在.NET中使用动态与对象相比,性能成本是多少 比如说,我有一个方法可以接受任何类型的参数。例如 public void Foo(object obj) { } 或 ILSpy告诉我,当使用动态代码时,编译器必须插入一个代码块来处理动态性。因此,我想知道是否建议使用动态来代替对象,以及这种使用会以性能为代价达到什么程度 因此,我想知道是否建议使用动态来代替对象,以及这种使用会以性能为代价达到什么程度 如果不需要动态键入,就不要使用它 如果您需要动态类型,例如,如果它避免了一些复杂的反射代码,那
动态
与对象
相比,性能成本是多少
比如说,我有一个方法可以接受任何类型的参数。例如
public void Foo(object obj)
{
}
或
ILSpy告诉我,当使用动态代码时,编译器必须插入一个代码块来处理动态性。因此,我想知道是否建议使用动态来代替对象,以及这种使用会以性能为代价达到什么程度
因此,我想知道是否建议使用动态来代替对象,以及这种使用会以性能为代价达到什么程度
如果不需要动态键入,就不要使用它
如果您需要动态类型,例如,如果它避免了一些复杂的反射代码,那么使用它并测量性能成本
成本在很大程度上取决于你到底在做什么。它几乎总是比静态类型的代码慢得多,在静态类型的代码中甚至可能出现等价的代码,但是有很多因素会影响确切的成本。与以往一样,在性能问题上,从一开始就编写最干净(不一定最短)的代码,衡量性能,如果它不符合您的性能目标,则仔细优化(通过频繁的衡量来检查您是否朝着正确的方向前进).这在很大程度上取决于具体的场景-但是内置了一层缓存,因此它并不像您预期的那样糟糕(它不会每次都进行反射)。它也可以随操作的不同而变化(例如,“提升”的null-T操作明显较慢)。您需要测量,但碰巧我这里有一些成员(属性)访问的时间,这是我在执行以下操作时采用的时间: 警告:这些是针对单个测试的,可能无法代表您的场景。这个代码是 所以:基于一个简单的测试,大约比静态规则C#慢20倍,但比反射快30倍 更新:有趣的是,在.NET 4.5中反射速度似乎更快了:
Static C#: 13ms
Dynamic C#: 249ms
PropertyInfo: 2991ms
PropertyDescriptor: 6761ms
TypeAccessor.Create: 77ms
ObjectAccessor.Create: 94ms
这里它只比反射快12倍,因为反射更快了(不是因为动态变慢了)。你能澄清一下
dynamic C#
测试吗:你测量了第一次调用的时间,还是后续(缓存的)调用的时间?我假设前者和随后的调用要快得多,但不确定。(我知道我可以自己测试,但我相信未来的读者也会从澄清中受益;)
Static C#: 14ms
Dynamic C#: 268ms
PropertyInfo: 8879ms (aka reflection)
PropertyDescriptor: 12847ms (aka data-binding)
TypeAccessor.Create: 73ms (aka FastMember)
ObjectAccessor.Create: 92ms (aka FastMember)
Static C#: 13ms
Dynamic C#: 249ms
PropertyInfo: 2991ms
PropertyDescriptor: 6761ms
TypeAccessor.Create: 77ms
ObjectAccessor.Create: 94ms