Java 开关箱顺序是否影响速度?
我试着用谷歌搜索这个,但没有成功 我有一个很大的转变,有些情况显然比其他情况更常见 因此,我想知道顺序是否真的保持原样,并且在测试小写之前先测试大写,因此评估速度更快 我想保留我的订单,但如果这会影响速度,那么重新排序分支将是一个好主意 举例说明:Java 开关箱顺序是否影响速度?,java,switch-statement,Java,Switch Statement,我试着用谷歌搜索这个,但没有成功 我有一个很大的转变,有些情况显然比其他情况更常见 因此,我想知道顺序是否真的保持原样,并且在测试小写之前先测试大写,因此评估速度更快 我想保留我的订单,但如果这会影响速度,那么重新排序分支将是一个好主意 举例说明: switch (mark) { case Ion.NULL: return null; case Ion.BOOLEAN: return readBoolean();
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字节码规范,开关可以编译为lookupswitch或tableswitch指令,打开int。lookupswitch总是按照排序顺序使用可能的值进行编译,因此对代码中的常量重新排序将不再重要,一个表开关只有一个相对于指定偏移量的可能跳转数组,所以它也不关心原始顺序
有关详细信息,请参见和。这不是瓶颈,我已经对其进行了分析。我只是想知道这是否真的会影响执行速度——出于好奇,我很确定顺序没有任何区别。JVM不像大型else/if那样按顺序处理这些案例。这更像是一种查找下一种方法。是的,但它必须通过某种查找表才能做到这一点,对吗?首先,无论编译器使用什么方法,速度上的差异都是最小的,除非你有数千个实例。第二,什么是声明的标记类型?如果它是一个枚举,那么将使用一个跳转表;如果是int,则根据值的密度使用跳转表或一系列if-then-else。在本例中,使用面向对象和多态性可能是更好的方法。例如,IonBase定义和抽象方法读取;浮动、布尔、布尔数组等。覆盖读取。而不是开关do return mark.read.Wow,老实说,我甚至不知道字节码有规格:D/Ok,所以我不会弄乱我的开关来获得假想的速度增益。我想接下来的问题是:值的排序顺序重要吗?如果Ion.NULL比Ion.BOOLEAN更常见,那么Ion.NULL