【发布时间】:2011-08-26 07:52:14
【问题描述】:
为了使我的代码通用,我已经开始使用反射——在 DTO 对象中获取一些属性并设置它们——
与硬编码的设置器相比,使用反射来获取属性并设置它们会严重影响性能吗?
【问题讨论】:
标签: c# .net performance reflection
为了使我的代码通用,我已经开始使用反射——在 DTO 对象中获取一些属性并设置它们——
与硬编码的设置器相比,使用反射来获取属性并设置它们会严重影响性能吗?
【问题讨论】:
标签: c# .net performance reflection
是的,使用反射是有成本的。
但是,对整体应用程序性能的实际影响各不相同。一条经验法则是切勿在多次执行的代码中使用反射,例如循环。这通常会导致算法速度呈指数级下降 (O(cn))。
在许多情况下,您可以使用委托而不是反射来编写通用代码,如this blog post 中所述。
【讨论】:
是的,反射很慢。
您可以尝试通过缓存 xxxInfo(如 MethodInfo、PropertyInfo 等)对象来减少它的影响,这些对象是通过每个反射类型的反射检索的,即将它们保留为字典。字典中的后续查找比每次都检索信息要快。
您也可以在 SO 上搜索有关反射性能的一些问题。对于某些极端情况,有一些非常高效的解决方法,例如使用 CreateDelegate 调用方法而不是使用 MethodInfo.Invoke()。
【讨论】:
除了必须通过反射设置属性较慢这一事实之外,这是一个设计问题,因为您显然已经通过面向对象的设计分离了关注点或封装了属性,这现在阻止您直接设置它们。我会说你看看你的设计(虽然可能有边缘情况)而不是考虑反射。
除了性能影响之外的一个缺点是您使用的是静态类型语言,因此编译器会检查您的代码并对其进行编译。通常在编译时,您可以确定您正在使用的所有属性都存在并且拼写正确。当您开始使用反射时,您将此检查推送到运行时,这真的很遗憾,因为您(在我看来)错过了使用静态类型语言的最大好处之一。这也将限制您在(不久的)将来的重构机会,因为您不再确定是否替换了所有出现的赋值,例如在重命名属性时。
【讨论】: