0

我试图从我的 Java Othello 程序中挤出所有内容,并且有一点需要计算给定数字出现的实例数。例如 array[]{1,1,2,1,0,1} 将 count(1) 返回 4。下面是我通过计算所有数字来快速进行的尝试,但这比较慢:

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;
}

有没有人认为他们可以从中挤出一些更快的速度?我只需要指定数量的计数,仅此而已。

4

4 回答 4

2

尝试进行计数int而不是byte某些体系结构在处理单个时遇到问题bytes,因此内存中的字节较小但进行计算时会出现问题。

于 2013-04-25T04:27:00.193 回答
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 循环有条件跳转和无条件跳转,但 do-while 循环只有条件跳转。

您可以并行执行此操作(thread1 计算元素 0-15,thread2 计算元素 16-31 等),但创建线程的成本可能不值得。

于 2013-04-25T04:28:34.290 回答
0

1) 版本 2 中的 this.get(i) 似乎很可疑,如果我们正在处理数组,array[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/获得良好的基准

于 2013-04-25T04:53:19.467 回答
0

您可以为此目的使用集合。但是您的数组应该是 Integer 类型,因为集合不支持原始类型。

public void count(int color) {  
   List<Integer> asList = Arrays.asList(your_Array);  
   return  Collections.frequency(asList,color);    
} 
于 2013-04-25T04:43:46.730 回答