在我目前的项目中,我尽力遵守过早优化是万恶之源的原则。但是,现在代码已经过测试,现在是优化的时候了。我做了一些分析,事实证明我的代码花费了近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),使用数组会更好吗?或者我能做些什么才能优化这个功能?
答案 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();
}
};