为啥要使用这么多 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 声明一个数组,我该如何优化它?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 psycopg2 INSERT 需要这么长时间才能循环运行,我该如何加快速度?

为啥有这么多 apache 进程在运行?

为啥我在发布模式 WP7 中出现这么多错误

为啥泡菜比 np.save 花费这么多时间?

为啥要在 C 中声明一个只包含数组的结构?

为啥一个简单的更新游标要花这么多时间?