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

时间:2011-11-04 14:45:55

标签: java performance switch-statement

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

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

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

...
    case LEAST_COMMON:
        // handle it
        break;
}

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

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

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

非常感谢,

克里斯

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

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

3 个答案:

答案 0 :(得分:4)

除非您确定此switch语句导致性能问题,否则我建议您过早优化。另外,请查看the accepted answer to this question

答案 1 :(得分:3)

如果这些案例是enum值或密集分布的int值,那么一旦JIT编译器开始将其全部转换为查找表,那么对命令进行修改将无法帮助您。

如果你正在使用Java7字符串开关或稀疏分布的值,那么最常见的应该是第一个,因为它变成了if的级联集 - 就像测试和分支操作一样。

答案 2 :(得分:1)

switch语句是执行查找以确定要跳转到哪个代码块。它不是一系列if / else检查,并且声明块的顺序对性能没有影响。即他们是所有案例值都被平等地检查。

伪代码与(对于小的int值范围)

相同
goto case_label[messageType.ordinal()];

对于较大的int值范围,使用不同的表结构。 (我假设它是一个哈希表)

CPU可以使用分支预测,如果一个案例比其他情况更常见,它可以动态优化执行。