2014-04-21 38 views
75

我試過谷歌這個,但沒有運氣。開關盒順序是否影響速度?

我有一個非常大的開關,有些情況是明顯比其他人更普遍

所以我想知道訂單是否真的保持原樣,並且「較低」的情況在「較低」之前得到測試,因此被評估得更快。

我想保留我的訂單,但如果它傷害速度,那麼重新排序分支將是一個好主意。

爲了說明:

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

這不是一個瓶頸,而且我實際上已經對它進行了描述。我只是想知道,這是否真的影響了執行速度 - 出於好奇,非常多。 – MightyPork

+1

我很確定訂單沒有任何區別。 JVM並沒有按照大的順序來處理這些案例。它更像是一種「仰望下一步去哪裏」的事情。 –

+0

你試過了嗎? –

回答

107

重新排序switch語句沒有任何效果。

縱觀Java字節碼規範,一個switch可以被編譯成一個lookupswitchtableswitch指令,上int切換。 A lookupswitch總是以排序順序編譯可能的值,因此重新排序代碼中的常量將永遠不會影響,並且tableswitch只是相對於指定的偏移量具有可能的跳轉數組,所以它也不會在乎原始訂單。

有關詳細信息,請參見http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.lookupswitchhttp://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.tableswitch

+0

哇,老實說,我甚至不知道字節碼的規格:D /好,所以我不會搞亂我的開關來獲得想象的速度增益。 – MightyPork

+12

我想下一個後續問題是:值的排序順序是否重要? (如果Ion.NULL比Ion.BOOLEAN更常見,如果Ion.NULL immibis

+0

參見http://stackoverflow.com/questions/12020048/how-does-javas-switch-工作在引擎蓋 – Raedwald

相關問題