Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用“动态”与“对象”的性能成本?_C#_.net_Performance_Dynamic_Compiler Construction - Fatal编程技术网

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

C# 使用“动态”与“对象”的性能成本?,c#,.net,performance,dynamic,compiler-construction,C#,.net,Performance,Dynamic,Compiler Construction,在.NET中使用动态与对象相比,性能成本是多少 比如说,我有一个方法可以接受任何类型的参数。例如 public void Foo(object obj) { } 或 ILSpy告诉我,当使用动态代码时,编译器必须插入一个代码块来处理动态性。因此,我想知道是否建议使用动态来代替对象,以及这种使用会以性能为代价达到什么程度 因此,我想知道是否建议使用动态来代替对象,以及这种使用会以性能为代价达到什么程度 如果不需要动态键入,就不要使用它 如果您需要动态类型,例如,如果它避免了一些复杂的反射代码,那

在.NET中使用
动态
对象
相比,性能成本是多少

比如说,我有一个方法可以接受任何类型的参数。例如

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