2014-11-25 180 views
-4

這個問題純粹是關於速度和效率,而不是關注哪個是結構性更好的方法。Java:哪個更快,數組或對象?

基本上我需要一個視圖模塊讀取的狀態,這基本上是一個字符數組。這些字符的位置,名稱,物品等

要麼我可以使角色對象的陣列與吸氣劑的信息,或我可以表示每個字符含有相同的信息的數組。

這兩個辦法的將是視圖模塊更快的閱讀?

例如: 方法1種

for(int i = 0; i < characters.length(); i++){ 
    Character temp = character[i]; 
    this.drawName(temp.getName()); 
    this.drawCharacterAt(temp.getColor(), temp.getX(), temp.getY()) 
    .... 
} 

方法2

for(int i = 0; i < characters.length(); i++){ 
    this.drawName(character[i][0]); 
    this.drawCharacterAt(character[i][1],character[i][2],character[i][3]); 
    .... 
} 
+2

似乎不成熟的優化。有沒有跡象表明,一個將要顯着*比其他慢,或這兩種方法將是緩慢的,足以進行任何優化,使之與一個是最簡單的代碼,閱讀和維護去。或者換句話說,使用對象是因爲它們具有特定的屬性,這使得地獄更加有意義。 – 2014-11-25 12:01:10

+0

測試它呢? – 2014-11-25 12:01:11

+0

只有基準測試能夠明確回答這個問題,但我敢打賭,對象更快;原因很簡單,數組的版本需要大量的轉換,這意味着JVM中的類型檢查開銷。 – 2014-11-25 12:02:10

回答

1

不應該有差別,至少後JIT踢讓我們來看看在每一種情況下會發生什麼:

案例1個陣列:

  • 我們從檢索數組對象的內存地址字符數組
  • 我們訪問第一個數組元素

案例2對象的內存位置:

  • 我們從字符數組
  • 我們所說的吸氣劑,吸氣
  • 檢索對象的內存地址,我們訪問name字段

的存儲位置,但是在JIT將內聯吸氣呼叫,使其:

  • 我們從字符數組檢索對象的內存地址
  • 我們訪問名字字段的內存位置

所以,在JIT與我們一起完成之後,我們最終得到相同的代碼。如果代碼執行的時間不足以讓JIT感興趣,那麼我們可能會忽略開銷。另外,使用getter可以更容易地看到會發生什麼。

+0

您忘記了數組邊界檢查,不能總是消除。 – maaartinus 2014-11-25 12:38:21

+0

正如上面在評論中提到的那樣,我認爲陣列版本需要'checkcast'來對陣列中的'Object'進行向下轉換的每個訪問,例如到'Integer';我不認爲JIT可以消除這些檢查。 – 2014-11-25 15:14:52

0

方法2是更內存效率 - 它涉及讀取數據較少 - 這可能使其更快。但方法1中的內存訪問模式可能更適合緩存/預取,這可能會產生更大的影響。與大多數性能問題一樣,唯一真正的答案是直接描述您的特定用例,並查看哪些在實踐中更快。