在.NET中,使用 dynamic
和 object
的性能成本是多少?
例如,假设我有一个接受任何类型参数的方法。例如:
public void Foo(object obj)
{
}
或者public void Foo(dynamic obj)
{
}
ILSpy告诉我,使用动态代码时,编译器必须插入一个代码块来处理动态性。因此,我想知道是否建议在对象的位置使用dynamic关键字,并且这种用法在性能方面会带来什么样的代价?
在.NET中,使用 dynamic
和 object
的性能成本是多少?
例如,假设我有一个接受任何类型参数的方法。例如:
public void Foo(object obj)
{
}
或者public void Foo(dynamic obj)
{
}
ILSpy告诉我,使用动态代码时,编译器必须插入一个代码块来处理动态性。因此,我想知道是否建议在对象的位置使用dynamic关键字,并且这种用法在性能方面会带来什么样的代价?
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)
注意:这些仅适用于单个测试,可能不代表您的情况。此代码在此处显示。
所以:基于简单的测试,它比静态常规C#慢约20倍,但比反射快约30倍。
更新:有趣的是,在.NET 4.5中,反射似乎变得更快了:
Static C#: 13ms
Dynamic C#: 249ms
PropertyInfo: 2991ms
PropertyDescriptor: 6761ms
TypeAccessor.Create: 77ms
ObjectAccessor.Create: 94ms
这里只是相对于反射,动态获取的速度快了大约12倍,因为反射变得更快了(不是因为动态获取变慢了)。
动态 C#
测试: 您是否测量了第一个调用的时间,还是后续(缓存的)调用的时间?我假设是前者,并且认为后续调用会更快,但不确定。(我知道我可以自己测试,但我相信未来的读者也会从这个澄清中受益 ;) ) - enzi