2013-04-25 44 views
0

我想擠出每一個,但我的Java黑白棋程序,並有一個點,我需要計算一個給定的數字出現的實例的數量。例如陣列[] {1,1,2,1,0,1}將計數(1)返回4下面是企圖予以速度通過計算的所有數值由但這是較慢:從數組中計數單個int的更有效方法?

public void count(int color) { 
    byte count[] = new byte[3]; 

    for (byte i = 0; i < 64; i++) 
     ++count[state[i]]; 

    return count[color]; 
} 

到目前爲止,這是最高效的代碼我已經測試:

public void count(int color) { 
    byte count = 0; 

    for (byte i = 0; i < 64; i++) 
     if (this.get(i) == color) 
      count++; 

    return count; 
} 

有誰認爲他們可以擠一些速度出來呢?我只需要指定數量的計數,僅此而已。

+0

你實際上只能使這個速度更快,如果數組進行排序,規模較小,或兩者兼而有之。 – 2013-04-25 04:23:11

回答

2

使用int而不是byte - 在內部,Java將字節轉換爲int,然後遞增,然後將其轉換回字節;使用int可以避免類型轉換的需要。

您也可以嘗試使用AtomicInteger,其getAndIncrement方法可能會比運算符++更快。

你也可以展開你的循環;這將減少i < 64的評估次數。嘗試使用的AtomicInteger爲i,並使用getAndIncrement代替++

for(int i = 0; i < 64;) { 
    if(this.get(i++) == color) ... 
    if(this.get(i++) == color) ... 
    if(this.get(i++) == color) ... 
    if(this.get(i++) == color) ... 
} 

for循環更改爲do-while循環可能會稍快 - for循環有一個條件跳轉和無條件跳轉,但一做而循環只有一個條件跳轉。

您可以並行執行此操作(線程1計數元素0-15,線程2計數元素16-31等),但創建線程的代價可能不值得。

2

嘗試製作計數int而不是byte某些體系結構在處理單個內​​存時遇到問題,因此內存中的字節較小但計算有問題。

0

您可以爲此使用集合。但是你的數組應該是Integer類型,因爲集合不支持原始類型。

public void count(int color) { 
    List<Integer> asList = Arrays.asList(your_Array); 
    return Collections.frequency(asList,color);  
} 
0

1)this.get(i)在版本2中似乎是可疑的,如果我們正在處理數組,數組[i]應該是更有效的。

2)我將取代

byte count = 0; 
for (byte i = 0; i < 64; i++) 
... 

int count = 0; 
for (int i = 0; i < 64; i++) 
... 

否則Java將需要推動字節操作數爲int做運算,然後截斷結果字節。

3)使用http://code.google.com/p/caliper/得到很好的基準

相關問題