提高性能反思 - 我应该考虑什么样的选择?提高性能反思 - 我应该考虑什么样的选择?(Improvi

2019-05-13 15:25发布

我需要动态地设置在一堆或属性值的对象上,把它的传输对象。

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

有没有办法? 如果是的话有没有样品的实现,我可以看看?

Answer 1:

使用Delegate.CreateDelegate把一个MethodInfo成强类型的代表。 这可以大量提高性能。 我有一个博客帖子这个示例代码。 请注意,这只会帮助,如果你需要多次设置相同的属性-基本上这意味着,当你创建委托很多类型检查都做完了一次 ,而不是每次调用。

马克Gravell有HyperPropertyDescriptor项目,达到了更好的性能,但引入了额外的依赖。 该项目成为了更现代的跳点快速会员 ( github上 )。 一般来说,你会使用快速会员超过HyperProperty。



Answer 2:

在.NET 4.0(测试版),您可以用更新的表达式树做到这一点,利用Expression.BlockExpression.Assign -然后编译一个类型的代表; 任务完成。

在.NET 2.0及以上(如乔恩提及)HyperDescriptor是一个合理的选择-它可以作为一个定制PropertyDescriptor实现,所以你只是做这样的代码:

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

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



Answer 3:

反射可以,如果你这样做的权利 (不一样快,静态代码,当然)极快。

寻找一个属性制定者是缓慢的。 调用委托快。

你需要得到和缓存Delegate对象,以便在每种类型的DTO的每个属性的制定者。 这是缓慢的一部分,但它是一个一次性的打击。 然后,你可以Invoke每一个给定DTO类型的物业制定者缓存的代表,传递DTO对象和新的属性值,但是这部分将是非常快的。



Answer 4:

你肯定确定,使用反射太慢? 虽然在.NET反射不一样快 ,静态代码,它仍然是非常快的。 你应该写在可能的最简单的方法的代码 - 即使使用反射 - 只有回来,如果你发现性能问题,并将其隔离到您使用反射来优化。 大多数时候,你不会有任何问题。 反射在各种性能敏感的代码,如ASP.NET MVC使用。



Answer 5:

反映了从Java坏名声在那里(或至少曾经是)非常缓慢。 这不是在.NET中的情况下,所以我不明白,使用它你的异议。 我也同意雷克斯,你不能说什么有没有实际测量性能较差。



Answer 6:

您可以使用轻量级的代码生成。 这里有一些文章:

  • http://blogs.msdn.com/joelpob/archive/2004/04/01/105862.aspx
  • http://wesnerm.blogs.com/net_undocumented/2005/06/lightweight_cod.html(镜像)
  • Dyanamic方法


文章来源: Improving performance reflection - what alternatives should I consider?