繁体   English   中英

为搜索优化 C++ 向量

[英]Optimizing C++ Vector for Search

在我目前的项目中,我尽力坚持过早优化是万恶之源的原则。 不过,现在代码已经测试过了,是时候进行优化了。 我做了一些分析,结果发现我的代码花费了将近 20% 的时间在一个函数中,它找到所有可能的孩子,把它们放在一个向量中,然后返回它们。 请注意,我正在优化速度,内存限制不是一个因素。

现在这个函数看起来像这样:

void Board::GetBoardChildren(std::vector<Board> &children)
{
    children.reserve(open_columns_.size()); // only reserve max number of children

    UpdateOpenColumns();

    for (auto i : open_columns_)
    {
        short position_adding_to = ColumnToPosition(i);
        MakeMove(position_adding_to); // make the possible move
        children.push_back(*this); // add to vector of children
        ReverseMove(); // undo move
    }
}

根据分析,我的代码在children.push_back(*this);行上花费了大约 40% 的时间children.push_back(*this); 我这样调用函数:

std::vector<Board> current_children;
current_state.GetBoardChildren(current_children);

我在想,由于可能的最大孩子数很小(7),只使用数组会更好吗? 或者我不能做很多事情来优化这个功能?

从你对我的评论的回应来看,很可能大部分时间都花在了抄板上

children.push_back(*this);

您需要找到一种避免制作所有这些副本的方法,或者一种使它们更便宜的方法。

简单地将向量更改为数组或列表可能不会对性能产生任何影响。

最重要的问题是:你真的需要 current_state 中的所有状态吗? 如果您只是按照默认顺序迭代它们一两次,那么就不需要向量,只需根据需要生成它们。

如果你真的需要它,这是下一步。 由于Board的复制成本很高,因此只跟踪DifferenceBoard可能会更好。 伪代码:

struct DifferenceBoard { // or maybe inherit from Board that a DifferenceBoard
                         // can be built from another DifferenceBoard
  Board *original;
  int fromposition, toposition;
  State state_at_position;

  State get(int y, int x) const {
    if ((x,y) == fromposition) return Empty;
    if ((x,y) == toposition  ) return state_at_position;
    return original->get();
  }
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM