Java 开关箱顺序是否影响速度?

Java 开关箱顺序是否影响速度?,java,switch-statement,Java,Switch Statement,我试着用谷歌搜索这个,但没有成功 我有一个很大的转变,有些情况显然比其他情况更常见 因此,我想知道,订单是否真的保持原样,“上档”案例在“下档”案例之前得到测试,因此评估速度更快 我想保留我的订单,但如果这会影响速度,那么重新排序分支将是一个好主意 举例说明: switch (mark) { case Ion.NULL: return null; case Ion.BOOLEAN: return readBoole

我试着用谷歌搜索这个,但没有成功

我有一个很大的转变,有些情况显然比其他情况更常见

因此,我想知道,订单是否真的保持原样,“上档”案例在“下档”案例之前得到测试,因此评估速度更快

我想保留我的订单,但如果这会影响速度,那么重新排序分支将是一个好主意

举例说明:

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);
    }

对switch语句重新排序没有任何效果

查看Java字节码规范,可以将
开关
编译为
查找开关
表开关
指令,打开
int
lookupswitch
总是按照排序顺序使用可能的值进行编译,因此对代码中的常量重新排序将不再重要,
tableswitch
只是相对于指定的偏移量有一个可能的跳转数组,所以它也不关心原始顺序


有关详细信息,请参见和。

这不是瓶颈,我已经对其进行了分析。我只是想知道这是否真的会影响执行速度——出于好奇,我很确定顺序没有任何区别。JVM不像大型else/if那样按顺序处理这些案例。这更像是一种“查找下一步要去哪里”之类的东西。是的,但它必须通过某种查找表才能做到这一点,对吗?首先,除非有数千个实例,否则无论编译器使用什么方法,速度上的差异都是最小的。其次,
标记的声明类型是什么?如果它是一个枚举,那么将使用一个跳转表;如果是int,则根据值的“密度”使用跳转表或一系列if-then-else。在本例中,使用面向对象和多态性可能是更好的方法。例如
IonBase
定义和抽象方法
read()
;浮动、布尔、布尔数组等。重写
read()
。而不是开关
do
return mark.read()
。哇,老实说,我甚至不知道字节码有规格:D/Ok,所以我不会弄乱开关来获得假想的速度增益。我想接下来的问题是:值的排序顺序重要吗?(如果Ion.NULL比Ion.BOOLEAN更常见,那么如果Ion.NULL