switch语句是在Java中实现运算符解释的最快方法

Mor*_*dan 2 java oop switch-statement

switch语句是在Java中实现运算符解释的最快方法

   public boolean accept(final int op, int x, int val) {
     switch (op) {
        case OP_EQUAL:
          return x == val;
        case OP_BIGGER:
          return x > val;
        case OP_SMALLER:
          return x < val;
        default:
          return true;
     }
   }
Run Code Online (Sandbox Code Playgroud)

在这个简单的例子中,显然是的.现在想象你有1000个运营商.它还会比类层次更快吗?当类层次结构在速度上比switch语句更有效时,是否存在阈值?(在内存中显然不是)

abstract class Op {
 abstract public boolean accept(int x, int val);
}
Run Code Online (Sandbox Code Playgroud)

然后每个操作员一个班级.

编辑:对不起,我应该通过答案的外观更具体.运营商是完全未知的,我正在使用JDk 1.4.没有选择.没有枚举.没有关闭.:(用户在许多选择中选择运算符.为简单起见,想象一下具有1000个操作的GUI列表,当用户选择一个时,选择switch语句的操作码.使用类层次结构,用户将选择一个我问这个问题是因为有人必须先测试过它.我不想创建1000个类和1000个虚假操作代码来测试它.如果没有人做过.我会测试它并报告结果,如果它们可能有任何意义.

Car*_*arl 9

编辑:

好的,既然你必须使用JDK 1.4,我的原始答案是禁止的(左下方供参考).我猜想switch当你只看到apply(which,a,b)vs which.apply(a,b)调用时,它并不像基于抽象类的解决方案那么快.你只需要测试一下.

但是,在测试时,您可能还需要考虑启动时间,内存占用等.

原版的:

public enum OPERATION {
  // ...operators+implementation, e.g.:
  GREATER_THAN { public boolean apply(int a, int b) { return a > b; } };
  public abstract boolean apply(int a, int b);
}
Run Code Online (Sandbox Code Playgroud)

用法:

OPERATION x = //..however you figure out which
boolean result = x.apply(a,b);
Run Code Online (Sandbox Code Playgroud)

这是针对枚举的Effective Java 中一种用例.它的工作方式与此类似switch,只是不那么容易混淆.


Wou*_*rts 8

由于switch语句通常在带有查找表的jvm中实现,因此很可能它会更快,具有少量或大量的运算符.这只是猜测; 要有一个明确的答案,你需要在它打算运行的系统上进行基准测试.

但是,这只是一个微观优化,你不应该关心,除非分析表明它可以真正有所作为.使用整数而不是特定的类(或枚举)会降低代码的可读性.1000个案例的巨大转换声明表明设计不好.这将对使用运算符的代码产生影响; 不太可读,更多错误,更难重构,......

并回到表演,这似乎是这里的目标.在难以阅读,设计糟糕的代码中,宏优化所需的更改变得更加困难.而这些优化通常比像这种转换这样的微优化更重要.