C#学习教程:在.NET中使用动态类型的性能成本分享


在.NET中使用动态类型的性能成本

在.NET中使用dynamic vs object的性能成本是多少? 比方说,我有一个接受任何类型参数的方法。 例如

 public void Foo(object obj) { } 

要么

 public void Foo(dynamic obj) { } 

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

这在很大程度上取决于确切的情况 – 但是内置了一层缓存,所以它并不像你想象的那么糟糕(它不会每次都进行reflection)。 它也可能因操作而异(例如,“提升”可空 – 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) 

CAVEAT:这些是针对单个测试的,可能无法代表您的方案。 此代码显示在此处

所以: 基于一个简单的测试 ,比静态常规C#慢20倍,但比reflection快约30倍。

更新:有趣的是,看起来reflection在.NET 4.5中变得更快:

 Static C#: 13ms Dynamic C#: 249ms PropertyInfo: 2991ms PropertyDescriptor: 6761ms TypeAccessor.Create: 77ms ObjectAccessor.Create: 94ms 

这里它只比reflection快约12倍,因为reflection速度更快(不是因为动态变慢)。

因此,我想知道是否建议使用动态代替对象,以及这种用法以性能为代价的程度是多少?

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

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

成本将在很大程度上取决于您正在做什么。 它几乎总是比静态类型代码更慢,其中等效代码甚至可能,但有很多因素会影响确切的成本。 与性能问题一样,编写最干净(不一定最短)的代码,开始使用,测量性能,如果不符合您的性能目标,请仔细优化(通过频繁的测量来检查您是否正在进行正确的方向)。

上述就是C#学习教程:在.NET中使用动态类型的性能成本分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—猴子技术宅(www.ssfiction.com)

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/ckf/959832.html

发表评论

邮箱地址不会被公开。 必填项已用*标注