我正在写一个国际象棋引擎作为学习项目。要决定要做出什么样的举动,需要通过从当前的董事会状态进行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
类中的一些小东西可能占用最多的CPU。但是,我有两个问题:
1。为什么声明一个数组占用最多CPU的Board
?
我期待移动计算或分析每个电路板状态的值,而不仅仅是创建数组。我是否有可能错误地阅读结果?
2。在这种情况下,如何优化我的表现?
我理解如何优化算法,但我不确定如何优化数组声明。我也不确定我可以使用哪种更好的数据结构来表示8x8板而不是2维阵列。
答案 0 :(得分:2)
- 为什么声明一个阵列占用了最多CPU的CPU?
醇>
因为这可能几乎就是你所做的一切。在堆中搜索可用空间占用的时间比其他任何时间都多。
- 在这种情况下如何优化我的表现?
醇>
只保留一块板并进行每次移动,测试并撤消每一步的移动。
如果您想要并行化,这是一种糟糕的方法,但它更快,更节省空间。 (好的电话@shmosel)