Оправдывает ли порядок коробок на скорость?
Я попытался это сделать Google, но не повезло.
У меня очень большой переключатель, и некоторые случаи, очевидно, более распространены, чем другие.
Итак, я хотел бы знать, действительно ли порядок действительно соблюден, и "верхние" случаи проверяются до "нижнего", поэтому их оценивают быстрее.
Я хотел бы сохранить свой заказ, но если он наносит вред скорости, то переупорядочение ветвей было бы хорошей идеей.
Для иллюстрации:
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);
}
Ответы
Ответ 1
Переупорядочение оператора switch не имеет никакого эффекта.
Глядя на спецификацию байт-кода Java, switch
можно скомпилировать в команду lookupswitch
или tableswitch
, включив int
. A lookupswitch
всегда скомпилирован с возможными значениями в отсортированном порядке, поэтому переупорядочение констант в коде не имеет значения, а 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 для подробности.