我目前正在使用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
答案 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可以使用分支预测,如果一个案例比其他情况更常见,它可以动态优化执行。