java - 一个大的 switch 语句还是几个小的 switch 语句?

标签 java switch-statement

我想知道一个大的 switch 语句和几个小的 switch 语句之间是否有性能差异。

包含数百个案例的大型 switch 语句。

switch(quest){
            case 1: quest1(); break;
            case 2: quest2(); break;
            .
            .
            .
            case 196: quest196(); break;
            case 197: quest197(); break;
            .
            .
            .
        }

或者几个较小的 switch 语句,每个语句有 30 个案例。

if (quest <= 30) {
        switch (quest) {
            case 1: quest1(); break;    
            case 2: quest2(); break;    
            case 3: quest3(); break;
            .
            .
            case 30: quest30(); break;
            default: 
                return;
        }
    } else if (quest <= 60) {
        switch (quest) {
            case 31: quest31(); break;  
            case 32: quest32(); break;  
            case 33: quest33(); break;
            .
            . 
            .
            case 60: quest60(); break;
            default:
                return;
        }
    } 
  .
  .
  .

另外,我知道反射会更容易编码,但这会导致很大的开销吗?

类似这样的东西。

try {
            Method method =Logic.class.getMethod("quest"+quest);
            method.invoke(this);
        } catch (NoSuchMethodException | SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

提前致谢。

最佳答案

大型 switch 与包含较小的 if/then/else 语句链之间的区别switch 是指单个 switch 将在一次查找中找到要执行的代码,而条件链在到达 switch< 之前可能需要多次单独检查 利益声明。一旦找到 switch 语句,几乎无论有多少个 case 标签,执行调度所需的时间都大致相同。单个 switch 语句也更具可读性,因此我更喜欢它而不是条件链。

虽然反射确实有开销,但这并不可怕,因此如果您的 questNNN 方法不是非常快,反射的开销不会有太大影响。您甚至可以通过准备一个 Method 对象数组来加速它,并预先填充它以避免 Logic.class.getMethod("quest"+quest) 调用您发送调用的时间。

最后,您可以创建一个 Runnable 对象数组,并将 questNNN 的调用封装在其中:

Runnable[] dispatch = new Runnable[] {
    new Runnable() { public void run() { quest0(); } }
,   new Runnable() { public void run() { quest1(); } }
,   new Runnable() { public void run() { quest2(); } }
,   new Runnable() { public void run() { quest3(); } }
,   new Runnable() { public void run() { quest4(); } }
...
,   new Runnable() { public void run() { quest59(); } }
,   new Runnable() { public void run() { quest60(); } }
};

现在您可以调用 dispatch[NNN].run() 来调用 questNNN 方法。

关于java - 一个大的 switch 语句还是几个小的 switch 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25026780/

相关文章:

c# - 失控的 switch 语句的最佳替代方法是什么?

java - 如何将我的状态机转换为 java?

java - 使用 groovy AST Transform 修改 java

java - 是否可以将 onClick 函数动态分配给按钮?

ios - 切换到另一个 View 时隐藏键盘

ios - 创建 switch 语句给我错误

templates - C++/C++11 - 可变参数模板的 Switch 语句?

java - 在java中按索引对数组列表的数组列表进行排序

java - 通过 Spring MVC Web 应用程序向客户端发送文本文件

java - Files.move REPLACE_EXISTING 无法解析为变量