2014-04-21 7 views
75

Próbowałem google, ale nie miałem szczęścia.Czy kolejność przełączników ma wpływ na prędkość?

Mam bardzo duży przełącznik, a niektóre przypadki to , co jest oczywiście bardziej powszechne od niż inne.

Chciałbym więc wiedzieć, czy zamówienie jest rzeczywiście przechowywane tak, jak jest, a "górne" przypadki są testowane przed "niższymi", dlatego są szybciej oceniane.

Chciałbym zachować moje zamówienie, ale jeśli to boli, to porządkowanie gałęzi będzie dobrym pomysłem.

Dla ilustracji:

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

To nie jest wąskie gardło, a ja go właściwie wyprofilowałem. Chcę tylko wiedzieć, czy to naprawdę wpływa na szybkość wykonania - z ciekawości. – MightyPork

+1

Jestem pewien, że zamówienie nie ma żadnej różnicy. JVM nie przechodzi przez przypadki po kolei, tak jak w przypadku długiego else/if. Jest to raczej "spojrzenie, gdzie pójść dalej". –

+0

Czy próbowałeś? –

Odpowiedz

107

Zmiana kolejności instrukcji switch nie ma żadnego wpływu.

Patrząc na specyfikację kodu bajtowego Javy, A switch może albo zostać skompilowany do lookupswitch lub instrukcji tableswitch, przełączenie na int. A lookupswitch jest zawsze kompilowany z możliwymi wartościami w posortowanej kolejności, więc zmiana kolejności stałych w kodzie nigdy nie będzie miała znaczenia, a tableswitch ma po prostu tablicę możliwych skoków względem określonego przesunięcia, więc ona również nigdy nie dba o oryginalne zamówienie.

Aby uzyskać szczegółowe informacje, patrz: http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.lookupswitch i http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.tableswitch.

+0

Wow, szczerze mówiąc, nawet nie wiedziałem bytecode ma specyfikacje: D/Ok, więc nie zepsuje mojego przełącznika, aby uzyskać wyimaginowany przyrost prędkości. – MightyPork

+12

Przypuszczam, że następne pytanie uzupełniające: czy posortowana kolejność wartości ma znaczenie? (jeśli Ion.NULL jest bardziej popularny niż Ion.BOOLEAN, czy będzie on szybszy, jeśli Ion.NULL immibis

+0

Zobacz także http://stackoverflow.com/questions/12020048/how-does-javas-switch- praca pod maską – Raedwald