开关盒顺序是否影响速度?

我试图谷歌这一点,但没有运气。

我有一个非常大的开关,有些情况显然比其他情况更常见

所以我想知道这个订单是否真的保持不变,而“较低”的情况是否在“较低”之前进行了testing,因此被评估得更快。

我想保留我的订单,但如果它伤害速度,那么重新sorting分支将是一个好主意。

为了说明:

switch (mark) { case Ion.NULL: return null; case Ion.BOOLEAN: return readBoolean(); case Ion.BYTE: return readByte(); case Ion.CHAR: return readChar(); case Ion.SHORT: return readShort(); case Ion.INT: return readInt(); case Ion.LONG: return readLong(); case Ion.FLOAT: return readFloat(); case Ion.DOUBLE: return readDouble(); case Ion.STRING: return readString(); case Ion.BOOLEAN_ARRAY: return readBooleans(); case Ion.BYTE_ARRAY: return readBytes(); case Ion.CHAR_ARRAY: return readChars(); case Ion.SHORT_ARRAY: return readShorts(); case Ion.INT_ARRAY: return readInts(); case Ion.LONG_ARRAY: return readLongs(); case Ion.FLOAT_ARRAY: return readFloats(); case Ion.DOUBLE_ARRAY: return readDoubles(); case Ion.STRING_ARRAY: return readStrings(); default: throw new CorruptedDataException("Invalid mark: " + mark); } 

重新sortingswitch语句没有任何作用。

查看Java字节码规范,可以将switch编译为lookupswitchtableswitch指令,然后开启int 。 一个lookupswitch总是以可能的值按照sorting顺序进行编译,所以重新sorting代码中的常量永远不会有问题,而且一个tableswitch只有一个相对于指定偏移量的可能跳转数组,所以它也不会关心原来的顺序。

请参阅http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.lookupswitch和http://docs.oracle.com/javase/specs/jvms/se7 /html/jvms-6.html#jvms-6.5.tableswitch了解详情。