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

我目前正在使用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

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

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

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

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

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

 goto case_label[messageType.ordinal()]; 

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

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