优化用于搜索的C ++向量

时间:2012-11-25 22:37:44

标签: c++ optimization

在我目前的项目中,我尽力遵守过早优化是万恶之源的原则。但是,现在代码已经过测试,现在是优化的时候了。我做了一些分析,事实证明我的代码花费了近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
    }
}

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

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

我在想,因为可能孩子的最大数量很少(7),使用数组会更好吗?或者我能做些什么才能优化这个功能?

2 个答案:

答案 0 :(得分:2)

从您对我的评论的回复中,似乎很可能大部分时间用于复制

中的电路板
children.push_back(*this);

你需要找到一种方法来避免制作所有这些副本,或者让它们变得更便宜。

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

答案 1 :(得分:1)

最重要的问题是:你是否真的需要在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();
  }
};