我正在制作一个国际象棋引擎,并且通过优化打了一堵砖墙。使用剖析器后,我发现移动生成是最重要的因素。当我仔细观察时,事实证明,当我找到一个动作时,花费大量时间生成动作就是调用std :: vector.push_back(move)。
有没有办法让动态大小的c ++容器快速?它不能是固定大小的数组,因为我无法提前知道将产生多少移动(尽管通常少于50个)。
有没有人有过这类问题的经验?如有必要,我会写自己的容器,但我觉得应该有一个标准的方法来做到这一点。
答案 0 :(得分:4)
在进行以下std::vector::reserve()
调用之前调用push_back()
足够的大小,以避免重复分配内存。
答案 1 :(得分:1)
Vector :: reserve()帮助。您可以尝试分析并查看移动次数的分布,并尝试提前预留最佳数量。不要担心内存浪费,因为当你有32 - 50次移动时,保留的内存可能是64,浪费14 - 32.所以保留8或甚至16的内存可能不会占用更多内存。
您是否需要按索引访问移动?为什么不使用std :: list?
或者您可以尝试push_back一个移动的shared_ptr,然后提前预留一些数字,浪费更少的内存。
答案 2 :(得分:1)
您是否尝试使用std::deque
进行分析?如果您不要求以连续的方式分配对象,那么它可能是最佳解决方案。它为前面提供恒定时间插入和擦除;如果您需要在序列的两端插入或擦除,通常会std::deque
。
您可以在GotW 54中阅读详细信息。
答案 3 :(得分:0)
您可以使用std::vector
并在适当的位置调用其reserve方法。
答案 4 :(得分:0)
push_back
是一个重要的时间,reserve
应该解决这个问题并不让我感到惊讶。
但是,如果您再次发布个人资料,您可能会发现其他一些事情是最重要的时间,例如您new
个对象的delete
和move
来电。
修复(通过合并),并再次执行此操作。现在,其他东西将会很大。
每次执行此操作时,您都会获得一个加速因子,并将这些因子相乘,直到您对结果非常满意为止。