【问题标题】:Is using reflection in .Net effects the performance reasonably bad? [duplicate]在.Net 中使用反射会影响性能吗? [复制]
【发布时间】:2011-08-26 07:52:14
【问题描述】:

可能重复:
How costly is Reflection?

为了使我的代码通用,我已经开始使用反射——在 DTO 对象中获取一些属性并设置它们——

与硬编码的设置器相比,使用反射来获取属性并设置它们会严重影响性能吗?

【问题讨论】:

    标签: c# .net performance reflection


    【解决方案1】:

    是的,使用反射是有成本的。

    但是,对整体应用程序性能的实际影响各不相同。一条经验法则是切勿在多次执行的代码中使用反射,例如循环。这通常会导致算法速度呈指数级下降 (O(cn))。

    在许多情况下,您可以使用委托而不是反射来编写通用代码,如this blog post 中所述。

    【讨论】:

    • 您可以使用带反射的委托。
    【解决方案2】:

    是的,反射很慢。 您可以尝试通过缓存 xxxInfo(如 MethodInfo、PropertyInfo 等)对象来减少它的影响,这些对象是通过每个反射类型的反射检索的,即将它们保留为字典。字典中的后续查找比每次都检索信息要快。

    您也可以在 SO 上搜索有关反射性能的一些问题。对于某些极端情况,有一些非常高效的解决方法,例如使用 CreateDelegate 调用方法而不是使用 MethodInfo.Invoke()

    【讨论】:

      【解决方案3】:

      除了必须通过反射设置属性较慢这一事实之外,这是一个设计问题,因为您显然已经通过面向对象的设计分离了关注点或封装了属性,这现在阻止您直接设置它们。我会说你看看你的设计(虽然可能有边缘情况)而不是考虑反射。

      除了性能影响之外的一个缺点是您使用的是静态类型语言,因此编译器会检查您的代码并对其进行编译。通常在编译时,您可以确定您正在使用的所有属性都存在并且拼写正确。当您开始使用反射时,您将此检查推送到运行时,这真的很遗憾,因为您(在我看来)错过了使用静态类型语言的最大好处之一。这也将限制您在(不久的)将来的重构机会,因为您不再确定是否替换了所有出现的赋值,例如在重命名属性时。

      【讨论】:

        猜你喜欢
        • 2012-08-15
        • 2016-06-06
        • 2010-09-26
        • 1970-01-01
        • 1970-01-01
        • 2015-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多