[英]Is using reflection in .Net effects the performance reasonably bad? [duplicate]
可能重复:
反射的成本是多少?
为了使我的代码通用,我开始使用Reflection-在DTO对象中获取一些属性并进行设置-
与硬编码设置器相比,使用反射来获取属性和设置属性是否会严重影响性能?
是的 ,使用Reflection需要付费。
但是,对整体应用程序性能的实际影响会有所不同。 一条经验法则是, 不要在多次执行的代码 (例如循环)中使用Reflection 。 这通常会导致算法以指数形式减速(O(c n ))。
在许多情况下,您可以使用委托而不是Reflection来编写通用代码,如本博文所述。
是的,反射很慢。 您可以尝试通过缓存每个反射类型通过反射检索的xxxInfo
(如MethodInfo,PropertyInfo等)对象来减少它的影响, xxxInfo
它们保留为字典。 字典中的后续查找比每次检索信息都要快。
您也可以在SO上搜索有关反射性能的一些问题。 对于某些极端情况,有相当不错的解决方法,例如使用CreateDelegate
调用方法而不是使用MethodInfo.Invoke()
。
除了必须通过反射来设置属性的速度较慢这一事实之外,还有一个设计问题,因为您显然已经通过面向对象的设计将关注点或封装的属性分离开了,这现在阻止了您直接设置它们。 我想说的是,您着眼于您的设计(尽管可能会有一些边际案例),而不是考虑反射。
除了性能影响之外,缺点之一是您使用的是静态类型的语言,因此编译器会检查您的代码并对其进行编译。 通常,在编译时,您可以确定正在使用的所有属性均已存在并且拼写正确。 当您开始使用反射时,您会将此检查推迟到运行时,这实在令人遗憾,因为您(我认为)缺少使用静态类型语言的最大好处之一。 这也将限制您在(不久的将来)的重构机会,因为您不确定例如在重命名属性时是否已替换所有出现的赋值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.