我目前正在使用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
重现步骤:
从JDK的src.zip中对java.lang.String进行一些简单的修改,例如添加
private boolean dummy = false;
编译更改(Eclipse编译器)
每次启动时,VM都会出现段错误.
操作系统是Linux(Debian Wheezy)x86_64.同时发生JDK 1.7.0_55和1.8.0_05
#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x0000000000000000, pid=13313, tid=140065468557056
#
# JRE version: (7.0_55-b13) (build )
# Java VM: Java HotSpot(TM) 64-Bit Server VM (24.55-b03 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C 0x0000000000000000
#
# Core dump written. Default location: /home/chris/workspace/JDK7/foo/core or core.13313
#
# If you would like to …Run Code Online (Sandbox Code Playgroud)