Beeinflusst die Switch-Case-Reihenfolge die Geschwindigkeit? [duplicate]

Lesezeit: 3 Minuten

Ich habe versucht, dies zu googlen, hatte aber kein Glück.

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

Ich würde also gerne wissen, ob die Reihenfolge wirklich so gehalten wird und die “großen” Fälle vor den “unteren” getestet werden und somit schneller ausgewertet werden.

Ich würde gerne meine Bestellung behalten, aber wenn es die Geschwindigkeit beeinträchtigt, wäre eine Neuordnung der Zweige eine gute Idee.

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

  • Es ist kein Engpass, und ich habe es tatsächlich profiliert. Ich möchte nur wissen, ob sich dies wirklich auf die Ausführungsgeschwindigkeit auswirkt – aus Neugier, ziemlich genau.

    – Mächtiges Schweinefleisch

    21. April 2014 um 19:39 Uhr


  • Ich bin mir ziemlich sicher, dass die Reihenfolge überhaupt keinen Unterschied macht. Die JVM geht die Fälle nicht der Reihe nach durch wie ein großes Sonst/Wenn. Es ist eher eine Art “nachschlagen, wo es als nächstes hingehen soll”.

    – Dawud ibn Kareem

    21. April 2014 um 19:40 Uhr

  • Ja, aber es muss eine Art Nachschlagetabelle durchlaufen, um dies zu tun, richtig?

    – Mächtiges Schweinefleisch

    21. April 2014 um 19:41 Uhr

  • Zunächst einmal ist der Geschwindigkeitsunterschied minimal, egal welchen Ansatz der Compiler verwendet, es sei denn, Sie haben Tausende von Fällen. Zweite, was ist der deklarierte Typ von mark? Wenn es sich um eine Aufzählung handelt, wird eine Sprungtabelle verwendet; Wenn es sich um ein Int handelt, wird je nach “Dichte” der Werte eine Sprungtabelle oder eine Reihe von If-Then-Elses verwendet.

    – Jim Garnison

    21. April 2014 um 19:51 Uhr

  • In diesem Beispiel könnte die Verwendung von Objektorientierung und Polymorphismus ein besserer Ansatz sein. Z.B IonBase definiert und abstrakte Methode read(); FloatIon, BooleanIon, BooleanArrayIon usw. überschreiben read(). Und statt der switch tun return mark.read().

    – Kasper van den Berg

    22. April 2014 um 11:10 Uhr

Benutzer-Avatar
Louis Wassermann

Das Umordnen einer switch-Anweisung hat keine Auswirkung.

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

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.

  • Wow, ehrlich gesagt wusste ich nicht einmal, dass Bytecode Spezifikationen hat: D / Ok, also werde ich meinen Schalter nicht durcheinander bringen, um einen imaginären Geschwindigkeitsgewinn zu erzielen.

    – Mächtiges Schweinefleisch

    21. April 2014 um 19:56 Uhr

  • Ich nehme an, die nächste Folgefrage lautet: Spielt die sortierte Reihenfolge der Werte eine Rolle? (Wenn Ion.NULL häufiger vorkommt als Ion.BOOLEAN, wird es schneller sein, wenn Ion.NULL < Ion.BOOLEAN?)

    – Benutzer253751

    22. April 2014 um 8:39 Uhr

  • Siehe auch stackoverflow.com/questions/12020048/…

    – Raedwald

    26. April 2014 um 8:50 Uhr

1228080cookie-checkBeeinflusst die Switch-Case-Reihenfolge die Geschwindigkeit? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy