改善绩效反思 - 我应该考虑哪些替代方案?

时间:2009-06-22 15:55:17

标签: c# .net performance reflection

我需要动态设置对象上的值或属性的值,将其称为传输对象。

将会创建相当数量的这些传输对象,并在短时间内设置其属性。我想避免使用反射。

有替代品吗?如果有样本实现我可以看一下吗?

6 个答案:

答案 0 :(得分:27)

使用Delegate.CreateDelegateMethodInfo变为强类型代理。这可以大大提高的性能。我有blog post about this示例代码。请注意,如果您需要多次设置相同的属性,这只会有所帮助 - 基本上这意味着在创建委托时,很多类型检查都是完成,而不是每次调用

Marc Gravell有一个HyperPropertyDescriptor项目,可以实现更好的性能,但引入了额外的依赖性。这个项目成为更现代的Fast Membergithub)的起点。通常,您将使用Fast Member而不是HyperProperty。

答案 1 :(得分:6)

在.NET 4.0(测试版)中,您可以使用更新的表达式树,使用Expression.BlockExpression.Assign执行此操作,然后将其编译为类型化的委托;完成工作。

在.NET 2.0及更高版本中(正如Jon所提到的)HyperDescriptor是一个合理的选择 - 它可以作为自定义PropertyDescriptor实现,因此您只需执行以下代码:

// store this collection for optimum performance
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(
    typeof(SomeType));
props["Name"].SetValue(obj, newName);
props["DateOfBirth"].SetValue(obj, newDoB);

这仍然有一点拳击,但这实际上并不是一个瓶颈。

答案 2 :(得分:3)

反射可以非常快如果你做得正确(当然不如静态代码那么快)。

查找属性设置器很慢。调用委托很快。

您需要为每种类型的DTO获取并缓存每个属性设置器的Delegate个对象。这是缓慢的部分,但这是一次性打击。然后,您可以Invoke给定DTO类型的属性设置器的每个缓存委托,传入DTO对象和新属性值,但这部分将非常快。

答案 3 :(得分:0)

您是否确定使用反射太慢了?虽然.NET中的反射不像静态代码那么快,但它仍然非常快。您应该以尽可能最简单的方式编写代码 - 即使它使用反射 - 只有在您发现性能问题并将它们与您使用反射隔离时才会回来进行优化。大多数时候,你不会有任何问题。反射用于各种性能敏感的代码,例如ASP.NET MVC。

答案 4 :(得分:0)

答案 5 :(得分:0)

反思从Java得到了一个糟糕的代表,它在(或者至少曾经)非常慢。在.net中并非如此,所以我不理解您对使用它的异议。我也同意雷克斯,你不能说没有实际测量的东西表现不佳。