2014-04-21 6 views
75

Ich habe versucht, dies zu googeln, aber hatte kein Glück.Beeinflusst die Switch-Reihenfolge die Geschwindigkeit?

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

Also ich würde gerne wissen, ob die Bestellung wirklich so gehalten wird, wie es ist und die "oberen" Fälle vor der "unteren" getestet werden, daher schneller bewertet werden.

Ich möchte meine Bestellung behalten, aber wenn es Geschwindigkeit schmerzt, dann wäre eine Nachbestellung der Filialen 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); 
    } 
+23

Es ist kein Engpass, und ich habe es tatsächlich profiliert. Ich will nur wissen, ob das die Ausführungsgeschwindigkeit wirklich beeinflusst - aus Neugier, ziemlich genau. – MightyPork

+1

Ich bin mir ziemlich sicher, dass die Reihenfolge überhaupt keinen Unterschied macht. Die JVM durchläuft die Fälle nicht wie eine große lange else/if. Es ist eher eine Art "Nachschlagen, wohin man als nächstes geht". –

+0

Haben Sie es versucht? –

Antwort

107

eine switch-Anweisung Neuordnen keine Auswirkungen hat.

am spec Java-Bytecode-Suche kann ein switch entweder eine Anweisung lookupswitch oder tableswitch kompiliert werden, auf einer int Schalt. Ein lookupswitch wird immer mit den möglichen Werten in sortierter Reihenfolge kompiliert, so dass das Umordnen der Konstanten im Code nie von Bedeutung ist, und ein 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.

Weitere Informationen finden Sie unter 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.

+0

Wow, ehrlich gesagt wusste ich nicht einmal Bytecode hat Spezifikationen: D/Ok, also werde ich meinen Schalter nicht vermasseln, um imaginäre Geschwindigkeitszunahme zu bekommen. – MightyPork

+12

Ich nehme an, die nächste Folgefrage ist: Ist die sortierte Reihenfolge der Werte wichtig? (Wenn Ion.NULL häufiger ist als Ion.BOOLEAN, wird es schneller sein, wenn Ion.NULL immibis

+0

Siehe auch http://StackOverflow.com/questions/12020048/how-does-javas-switch- Arbeit unter der Haube – Raedwald

Verwandte Themen