【问题标题】:Reflection runtime performance - Java vs CLR反射运行时性能 - Java 与 CLR
【发布时间】:2009-01-13 19:22:43
【问题描述】:

一个相关的帖子here 在 Java 中几乎确立了反射作为性能猪。这也适用于 CLR 吗? (C#、VB.NET 等)。

编辑:在反射方面,CLR 与 Java 相比如何?是否曾经进行过基准测试?

【问题讨论】:

    标签: java reflection clr performance


    【解决方案1】:

    我并不真正关心使用反射本身的对象的实例化性能,而是方法的实际性能等等,因为这些毕竟是我将从类中使用的东西。

    当然,实例化需要很多时间,如链接的帖子中所示,但由于您很可能使用对象的方法而不是仅仅实例化它,因此您不必太担心反射性能 - 只要您没有通过调用反射的Method 对象来进行方法调用!

    除了您只需要对象的一个​​反射实例之外,如果您需要创建更多副本,请使用.clone() 和其他巧妙的技巧。

    【讨论】:

    • 如果你使用反射作为你的逻辑的一部分——不一定要实例化任何东西,而是使用你的类型定义作为指导——有点“元编程”?
    • 如果您不实例化对象,为什么还要反射(部分)它们?我很想看看你的确切意思的例子,如果你有时间请更详细地解释。
    • 假设您有一个对象列表并且想要编辑它们的值。通过反射,您可以构建一个允许您这样做的单一用户界面。您可以为标签、最大尺寸等定义属性。
    • 啊,这种行为的有效案例,现在我明白你的意思了。是的,不幸的是,这很慢,但如果我没记错的话(这里有点模糊),可以使用 java.lang.reflect.Proxy 创建一个代理对象,通过为列表中的每个对象重用代理来加速此类功能。
    • 我知道在 Java 中它很慢,但我很好奇这是否同样适用于 C#。
    【解决方案2】:

    是的,.NET 中的反射也是一项性能密集型操作,因为它需要查询程序集中的元数据表。

    【讨论】:

    • 即使将程序集加载到内存中,这仍然是真的吗?
    • 是的。按名称动态解析类型和成员需要在类型系统中查找它们,这显然比静态解析慢。
    • 是的,因为即使程序集在内存中,您仍然必须查看元数据表,这是比较慢的部分。
    • 另外...在反射方面,CLR 与 Java 相比如何?
    • 通过简单的代码 sn-p 很容易看出它的速度要慢得多。类似于您为 Java 链接的那个。然而,它实际上是一个依赖于运行时的东西。您应该针对特定版本的 Java 运行时和 .NET 运行时进行基准测试。
    【解决方案3】:

    值类型的 Equals 的默认实现是使用反射实现的。它可以工作,但是速度很慢,并且很容易实现特定版本,这要快得多(问题是您还必须实现 GetHashCode)。当然,快多少取决于实际的价值类型,但我在这里看到了一些巨大的提升。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-30
      • 2011-07-13
      • 2014-07-29
      • 1970-01-01
      • 2018-05-21
      • 2011-06-06
      • 2015-12-12
      • 1970-01-01
      相关资源
      最近更新 更多