为啥要使用这么多 CPU 声明一个数组,我该如何优化它?
Posted
技术标签:
【中文标题】为啥要使用这么多 CPU 声明一个数组,我该如何优化它?【英文标题】:Why is declaring an array using so much CPU, and how can I optimize it?为什么要使用这么多 CPU 声明一个数组,我该如何优化它? 【发布时间】:2017-02-10 06:52:21 【问题描述】:我正在编写一个国际象棋引擎作为一个学习项目。要决定采取什么行动,它需要分析从当前棋盘状态进行 4 步可达到的所有棋盘状态。这意味着我必须分析数十万块电路板。
代码很慢是可以理解的,所以我使用内置的 Netbeans 分析器来查看我应该优化哪个函数。我惊讶地发现,这只是在复制的 Board
对象中创建新数组,占用的 CPU 最多。
这是它所说的使用最多 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。但是,我对此有 2 个问题:
1.为什么在Board
中声明数组占用了最多的 CPU?
我期望移动计算或分析每个棋盘状态的价值不仅仅是创建数组。是不是我读错了结果?
2。在这种情况下如何优化我的表现?
我了解如何优化算法,但不确定如何优化数组声明。我也不确定有什么比二维数组更好的数据结构来表示 8x8 板。
【问题讨论】:
不幸的是,您切断了显示该方法如何经常被调用的列。那是打一个电话还是打多个电话的时间?如果有,那么有多少? @a_horse_with_no_name 我没有删减任何内容...该专栏不适合我。让我看看我是否可以尝试让它出现。但是,对于许多调用来说几乎可以肯定的是,因为我们知道在分析期间将初始化数十万块板 点击结果表右上角,可选择显示哪些列:imgur.com/a/QsRLD @a_horse_with_no_name 对此进行了检查,即使程序运行时间很短,也有 3000 次调用。 所以每次调用大约需要 12 毫秒,这看起来确实很慢。这个数组有多大?如果没有创建一个更小的数组,您可能只能通过不频繁地调用该函数来改进它。 【参考方案1】:为什么声明数组会占用 Board 中最多的 CPU?
因为这可能是你所做的几乎所有事情。在堆中搜索空闲空间比其他任何事情都需要更多时间。
在这种情况下如何优化我的性能?
只保留一个棋盘并进行每一步,对其进行测试并撤消每一步的移动。
如果您想要并行化,这是一种不好的方法,但它更快且更节省空间。 (好电话@shmosel)
【讨论】:
@shmosel 没有什么能阻止您创建 16 个板,或 96 个或任何您拥有的内核数量。 @Kayaman 这会将每个分支锁定到特定线程,这意味着您失去了窃取工作的机会。 这是个好主意,我正在研究它。如果实施它可以显着提高我的性能并且不会导致其他问题,我会接受答案。同时,我将保持开放状态,以防其他人有不同的优化想法 这暴露了一些我必须解决的其他问题,但最终它提高了 20 倍或更多的性能。谢谢!以上是关于为啥要使用这么多 CPU 声明一个数组,我该如何优化它?的主要内容,如果未能解决你的问题,请参考以下文章