【问题标题】:java: is it more efficient a switch or a reflection?java:开关还是反射更有效?
【发布时间】:2013-06-17 10:37:21
【问题描述】:

从 jsp 我得到一个可以用于开关的字符串

switch(value)
case 0: method0(); break;
case 1: method1(); break;
...

或用于反思:

c.getMethod("method"+value, parameter);
...

哪种方法更有效?

【问题讨论】:

  • 反射总是很昂贵。只有在别无他法时才使用它。
  • 你试过微基准测试吗?即编写代码并查看!我最初的猜测是开关 - 请注意,它假设更多,通常如果你假设更多,你可以走得更快!

标签: java performance reflection switch-statement


【解决方案1】:

反射肯定不会更快,因为它必须经过额外的层。

但是,将反射用于此类任务将是错误的方式,因为它会使代码更难维护,并且不能满足反射设计的真正目的。

【讨论】:

    【解决方案2】:

    如果您有固定数量的方法并且您只是懒惰输入 1000 个不同的cases,那么您肯定会使用switch,因为那语句在 JVM 字节码级别进行了高度优化。

    如果您有不定数量的方法,您可以使用反射(可能您没有任何其他选择)。您仍然可以通过缓存从getMethod() 获得的Method 实例来加快进程。

    请注意,通过反射传递参数总是会创建额外的 Classes 和 Objects 数组。

    【讨论】:

      【解决方案3】:

      反思总会有一些开销

      来自javadoc

      因为反射涉及动态解析的类型, 无法执行某些 Java 虚拟机优化。 因此,反射操作的性能比它们的要慢 非反射对应物,应在代码部分中避免 在性能敏感的应用程序中经常调用它们。

      【讨论】:

        【解决方案4】:

        如果您正在寻找更快的性能,反射会产生很大的开销。根据Oracle Java tutorials

        由于反射涉及到动态解析的类型,某些 Java 虚拟机优化无法执行。因此,反射操作的性能比它们的非反射操作慢,应该避免在对性能敏感的应用程序中频繁调用的代码段中。

        Java VM 具有特殊的字节码,可用于 lookupswitchtableswitch 等 switch-case。

        如果您能够实现,最好的方法是多态,即面向对象的方法。

        【讨论】:

        • 如果我(从我的jsp)得到的唯一东西是一个告诉我我必须调用哪个方法的字符串,有没有办法使用多态性?
        • 然后使用 switch case ,但我还没有得到你的设计!
        • 真的很简单,用户选择一个组合框,这会返回给我一个字符串 id 值,由此我要为每个 id 调用不同的方法
        【解决方案5】:

        使用开关

        反射很强大,但不应该乱用。如果可以在不使用反射的情况下执行操作,那么最好避免使用它。

        http://docs.oracle.com/javase/tutorial/reflect/index.html

        【讨论】:

          【解决方案6】:

          最好使用 switch 选项,因为与内存相比,反射很重。如果这种情况不可用,以便您可以在 switch 语句中处理,而在反射中您有输入示例 * 所以它会查找不可用的方法 method* 可能是什么。

          【讨论】:

          • 和 switch 语句通常意味着某种多态性,所以使用 OO to 而不是 switch
          【解决方案7】:

          基本上先明白什么时候使用反射?它主要用于反射,以动态创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,您可以调用该类型的方法或访问其字段和属性。

          但这里没有这种情况,最好使用 switch 而不是 reflection

          并避免不必要的流程负担。

          【讨论】:

            猜你喜欢
            • 2012-08-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-26
            • 1970-01-01
            • 2023-04-04
            相关资源
            最近更新 更多