为什么声明一个数组使用了这么多 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 板比二维数组更好。
- Why is declaration of an array taking the most CPU of anything withing Board?
因为这可能是您所做的几乎所有事情。在堆中搜索空闲 space 比其他任何事情都占用更多时间。
- How can I optimize my performance in this case?
只保留一个棋盘,每走一步,测试一下,每走一步就撤消走法。
如果您想并行化,这是一种糟糕的方法,但它更快、更多 space-efficient。 (打得好@shmosel)
我正在编写一个国际象棋引擎作为一个学习项目。为了决定走什么棋,它需要分析从当前棋盘状态下走 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 板比二维数组更好。
- Why is declaration of an array taking the most CPU of anything withing Board?
因为这可能是您所做的几乎所有事情。在堆中搜索空闲 space 比其他任何事情都占用更多时间。
- How can I optimize my performance in this case?
只保留一个棋盘,每走一步,测试一下,每走一步就撤消走法。
如果您想并行化,这是一种糟糕的方法,但它更快、更多 space-efficient。 (打得好@shmosel)