C++ 优化C++;搜索向量
在我目前的项目中,我尽了最大努力坚持过早优化是万恶之源的原则。但是,现在代码已经过测试,是时候进行优化了。我做了一些分析,结果发现我的代码在一个函数中花费了将近20%的时间,在这个函数中,它找到了所有可能的子元素,将它们放在一个向量中,然后返回它们。请注意,我正在优化速度,内存限制不是一个因素 现在,函数如下所示:C++ 优化C++;搜索向量,c++,optimization,C++,Optimization,在我目前的项目中,我尽了最大努力坚持过早优化是万恶之源的原则。但是,现在代码已经过测试,是时候进行优化了。我做了一些分析,结果发现我的代码在一个函数中花费了将近20%的时间,在这个函数中,它找到了所有可能的子元素,将它们放在一个向量中,然后返回它们。请注意,我正在优化速度,内存限制不是一个因素 现在,函数如下所示: void Board::GetBoardChildren(std::vector<Board> &children) { children.reserve
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
}
}
std::vector<Board> current_children;
current_state.GetBoardChildren(current_children);
我在想,既然可能的子对象的最大数量很小(7),那么使用数组会更好吗?或者我能做的不是很多来优化这个功能吗?从你对我评论的回复来看,似乎大部分时间都花在了抄写黑板上
children.push_back(*this);
你需要找到一种避免制作所有这些拷贝的方法,或者一种使它们更便宜的方法
简单地将向量更改为数组或列表可能不会对性能产生任何影响。最重要的问题是:您真的需要当前状态中的所有状态同时出现吗? 如果您只是按照默认顺序对它们迭代一两次,那么就不需要向量,只需根据需要生成它们 如果你真的需要它,下面是下一步。由于
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();
}
};
子对象。向后推(*此)
制作板
对象的副本。制作那个副本有多贵?@NPE这个操作非常昂贵,它是一个相当大的对象。然而,我没有找到复制的方法。我使用的是深度优先算法,据我所知,我需要为每个可能的孩子提供一份新的副本。我想大部分时间都是这样。“我认为向量本身是一条红鲱鱼。”@SidharthMudgal不,我不是通过索引访问的。我一直认为,对于小集合,像这样的代码,push_back
而不是实际的复制构造函数来指向行。非常有趣。我会回去看看算法,看看是否可以减少拷贝。“让它们更便宜”是否比仅仅减少尺寸更重要?我使用的是默认的复制构造函数。@Kyryx:它取决于板类的内容。例如,如果它包含一些在单板之间相同且不可变的字段,那么通过指针而不是通过值复制它们可能会更便宜。