对于一个类项目,我们正在创建一个简单的编译器/关系数据库。我会产生正确答案,但对大型查询来说太慢。我运行了visual studio的性能分析,我的程序花了80%的时间将我的元组(表中的行)插入到一个集合中。该函数是计算跨产品的一部分,因此结果有很多行,但我需要更快的方法将我的元组插入集合中。
for (set<vector<string>>::iterator it = tuples.begin(); it != tuples.end(); ++it)
{
for (set<vector<string>>::iterator it2 = tuples2.begin(); it2 != tuples2.end(); ++it2)
{
vector<string> f(*it);
f.insert(f.end(), it2->begin(), it2->end());
newTuples.insert(f); //This is the line that takes all the processing time
}
}
答案 0 :(得分:4)
您无缘无故地按值复制大向量。你应该移动:utl_http.end_response(l_http_response);
答案 1 :(得分:1)
set
可能是错误的容器。订购set
,并且仅保留唯一元素。当您插入新的string
时,可能会发生许多vector
次比较。
使用list
或vector
代替(如果可以)。
...并且避免不必要的复制,正如SergeyA在他的回答中指出的那样
答案 2 :(得分:0)
我们不妨去C ++ 11(完全未经测试的代码)
for (const auto& it : tuples) {
for (const auto& it2 : tuples2) {
auto where = newTuples.emplace(it); // returns where its placed
auto& vect = where.first; // makes the next more readable
vect.insert(vect.end(), it2.begin(), it2.end());
}
}
关于碰撞的注意事项一些字符串从结果中消失,这真的是你想要的吗? 你使用矢量作为关键,这将是一次碰撞吗?添加
if (!where.second) {
; // collision
}
检查。
这应该删除所有移动的双重工作(如果编译器无论如何都不优化它)。