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

时间:2017-02-10 06:52:22

标签: java arrays optimization netbeans profiling

我正在写一个国际象棋引擎作为学习项目。要决定要做出什么样的举动,需要通过从当前的董事会状态进行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;
}

以下是分析器结果:

enter image description here

显然我明白,创建和查看大量的电路板意味着Board类中的一些小东西可能占用最多的CPU。但是,我有两个问题:

1。为什么声明一个数组占用最多CPU的Board

我期待移动计算或分析每个电路板状态的值,而不仅仅是创建数组。我是否有可能错误地阅读结果?

2。在这种情况下,如何优化我的表现?

我理解如何优化算法,但我不确定如何优化数组声明。我也不确定我可以使用哪种更好的数据结构来表示8x8板而不是2维阵列。

1 个答案:

答案 0 :(得分:2)

  
      
  1. 为什么声明一个阵列占用了最多CPU的CPU?
  2.   

因为这可能几乎就是你所做的一切。在堆中搜索可用空间占用的时间比其他任何时间都多。

  
      
  1. 在这种情况下如何优化我的表现?
  2.   

只保留一块板并进行每次移动,测试并撤消每一步的移动。

如果您想要并行化,这是一种糟糕的方法,但它更快,更节省空间。 (好的电话@shmosel)