在很多情况下优化Java switch语句?

Chr*_*des 7 java performance switch-statement

我目前正在使用switch语句来处理有大约20种不同情况的传入消息类型.其中一些案例比其他案件更有可能发生数量级.

热点编译器是否能够优化检查案例的顺序以找到要执行的正确案例,或者我应该构建我的代码以便最常见的案例首先出现:

switch(messageType)
{
    case MOST_COMMON:
        // handle it
        break;

...
    case LEAST_COMMON:
        // handle it
        break;
}
Run Code Online (Sandbox Code Playgroud)

所有案件都是互相排斥的.

我会更好地使用策略模式和消息类型的Map查找吗?

性能是关键问题,因为我每秒处理数千条消息,并且正在尝试减少对象创建和方法调用开销.

非常感谢,

克里斯

编辑:感谢指点.messageType是一个具有较小值范围的int,因此看起来它将编译为"tableswitch"字节码,因此无需重新排序.

JVM规范的相关部分在这里http://java.sun.com/docs/books/jvms/second_edition/html/Compiling.doc.html#14942

Mik*_*uel 5

如果情况是enum值或密集分布的int值,那么一旦 JIT 编译器启动将其全部转换为查找表,对顺序进行处理将不会对您有帮助。

如果您使用 Java7 字符串开关或稀疏分布的值,那么最常见的应该首先进行,因为它会变成一组级联的类似if测试和分支操作。


Mik*_*ike 4

除非您确定此 switch 语句会导致性能问题,否则我建议您过早进行优化。另外,请查看此问题的已接受答案