Frage Ändert sich die Reihenfolge der Fälle auf die Geschwindigkeit? [Duplikat]


Diese Frage hat hier bereits eine Antwort:

Ich habe versucht, das zu googeln, aber hatte kein Glück.

Ich habe einen sehr großen Schalter, und einige Fälle sind offensichtlich häufiger als andere.

Also würde ich gerne wissen, ob der Auftrag wirklich so gehalten wird und die "oberen" Fälle vor dem "niedrigeren" getestet werden und daher schneller bewertet werden.

Ich würde gerne meine Bestellung behalten, aber wenn es schnell wehtut, dann wäre es eine gute Idee, die Filialen neu zu ordnen.

Zur Veranschaulichung:

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

76
2018-04-21 19:36


Ursprung


Antworten:


Das Umstellen einer switch-Anweisung hat keine Auswirkungen.

Betrachtet man die Java-Bytecode-Spezifikation, a switch kann entweder zu einem kompiliert werden lookupswitch oder ein tableswitch Anweisung, Einschalten eines int. EIN lookupswitch wird immer mit den möglichen Werten in sortierter Reihenfolge kompiliert, so dass eine Neuordnung der Konstanten im Code niemals von Bedeutung ist, und a tableswitch hat nur ein Array der möglichen Sprünge relativ zu einem bestimmten Offset, so dass es sich auch nie um die ursprüngliche Reihenfolge kümmert.

Sehen http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.lookupswitch und http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.tableswitch für Details.


109
2018-04-21 19:50