使用“动态”与“对象”的性能成本?

问题描述 投票:0回答:2

在 .NET 中使用

dynamic
object
的性能成本是多少?

举例来说,我有一个接受任何类型参数的方法。 EG

public void Foo(object obj)
{
}

public void Foo(dynamic obj)
{
}

ILSpy 告诉我,当使用动态代码时,编译器必须插入一个代码块来处理动态性。因此,我想知道是否建议使用动态代替对象,以及这种用法会以性能为代价达到什么程度?

c# .net performance dynamic
2个回答
52
投票

这很大程度上取决于具体的场景 - 但有一个内置的缓存层,所以它并不像你想象的那么糟糕(它不会每次都进行反射)。它也可能因操作而异(例如,“提升的”可空 T 操作明显更慢)。您需要进行测量,但碰巧我在这里有一些会员(财产)访问的时间,这是我在做FastMember时采取的:

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 倍,因为反射变得更快(不是因为动态变慢)。


25
投票

因此我想知道是否建议使用动态代替对象,以及这种用法会以性能为代价达到什么程度?

如果不需要动态类型,就不要使用它。

如果您需要动态类型 - 例如,如果它避免了一些复杂的反射代码 - 那么使用它并测量性能成本。

成本将很大程度上取决于你正在做什么。它几乎总是比静态类型代码慢,静态类型代码甚至是可能的,但有很多因素会影响确切的成本。与性能问题一样,编写最干净(不一定是最短)的代码,首先测量性能,如果它没有达到您的性能目标,请仔细优化(通过频繁的测量来检查您是否进入了最佳状态)。正确的方向)。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.