[英]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.