为什么声明一个数组使用了这么多 CPU,我该如何优化它?

Why is declaring an array using so much CPU, and how can I optimize it?

我正在编写一个国际象棋引擎作为一个学习项目。为了决定走什么棋,它需要分析从当前棋盘状态下走 4 步可以到达的所有棋盘状态。这意味着我必须分析数十万个电路板。

代码速度慢是可以理解的,所以我使用内置的 Netbeans 分析器来查看我应该优化哪个函数。我惊讶地发现,使用最多 CPU.

的只是在复制的 Board 对象中创建新数组

这是它说使用最多的函数 CPU,特别是 init1():

private void initializeFields(Color active) {
    init1();
    init2(active);
    init3();
    init4();
}

private void init1() {
    //this line appears to be using a ton of CPU
    pieces = new Piece[SQUARES_PER_SIDE][SQUARES_PER_SIDE];
}

private void init2(Color active) {
    activePlayer = active;
}

private void init3() {
    moveHistory = new LinkedList<>();
}

private void init4() {
    possibleMoves = null;
}

下面是探查器结果:

显然,我知道正在创建和查看的大量图板意味着 Board class 中的一些小东西可能会占用最多 CPU。但是,我对此有 2 个问题:

1.为什么数组的声明占用 Board 中最多的 CPU?

我期望对每个棋盘状态的值进行移动计算或分析,而不是简单地创建数组。有没有可能是我读错了结果?

2。在这种情况下我该如何优化性能?

我了解如何优化算法,但不确定如何优化数组声明。我也不确定用什么数据结构来表示 8x8 板比二维数组更好。

  1. Why is declaration of an array taking the most CPU of anything withing Board?

因为这可能是您所做的几乎所有事情。在堆中搜索空闲 space 比其他任何事情都占用更多时间。

  1. How can I optimize my performance in this case?

只保留一个棋盘,每走一步,测试一下,每走一步就撤消走法。

如果您想并行化,这是一种糟糕的方法,但它更快、更多 space-efficient。 (打得好@shmosel)