C++ 为什么要插入到集合中<;向量<;字符串>&燃气轮机;这么慢?
对于一个类项目,我们正在制作一个简单的编译器/关系数据库。我的答案是正确的,但在大型查询中速度太慢。我运行了VisualStudio的性能分析,我的程序花费了80%的时间将元组(表中的行)插入到集合中。该函数是计算叉积的一部分,因此结果有很多行,但我需要关于将元组插入集合的更快方法的建议C++ 为什么要插入到集合中<;向量<;字符串>&燃气轮机;这么慢?,c++,performance,vector,set,C++,Performance,Vector,Set,对于一个类项目,我们正在制作一个简单的编译器/关系数据库。我的答案是正确的,但在大型查询中速度太慢。我运行了VisualStudio的性能分析,我的程序花费了80%的时间将元组(表中的行)插入到集合中。该函数是计算叉积的一部分,因此结果有很多行,但我需要关于将元组插入集合的更快方法的建议 for (set<vector<string>>::iterator it = tuples.begin(); it != tuples.end(); ++it) { for (
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
}
}
for(set::iterator it=tuples.begin();it!=tuples.end();+it)
{
for(set::iterator it2=tuples2.begin();it2!=tuples2.end();+it2)
{
向量f(*it);
f、 插入(f.end(),it2->begin(),it2->end());
newTuples.insert(f);//这是占用所有处理时间的行
}
}
您无缘无故地按值复制大向量。您应该移动:newTuples.insert(std::move(f))代码>您无缘无故地按值复制大向量。您应该移动:newTuples.insert(std::move(f))代码>一个集合
可能是错误的容器。集合
是有序的,只保留唯一的元素。插入新的向量时,可能会发生许多字符串
比较
使用列表
或向量
(如果可以的话)
…并避免不必要的复制,正如SergeyA在他的回答中指出的那样,Aset
可能是错误的容器。集合
是有序的,只保留唯一的元素。插入新的向量时,可能会发生许多字符串
比较
使用列表
或向量
(如果可以的话)
…并避免不必要的复制,正如SergeyA在他的回答中指出的那样,我们不妨使用C++11(完全未经测试的代码)
注意:有些字符串会从结果中消失,这真的是您想要的吗?
你使用向量作为键,会不会发生碰撞?加
if (!where.second) {
; // collision
}
检查
这将消除所有移动的双重工作(如果编译器无论如何都没有优化它)。我们不妨使用C++11(完全未经测试的代码)
注意:有些字符串会从结果中消失,这真的是您想要的吗?
你使用向量作为键,会不会发生碰撞?加
if (!where.second) {
; // collision
}
检查
这将消除所有移动的双重工作(如果编译器无论如何都没有对其进行优化)。什么是newTuples
?在每次插入时通过复制创建向量。使用指针和new。@Pierreemanuellallemant,这是一个多么糟糕的建议…@SergeyA:不知道std::move,ty.newTuples是我正在创建的新表中的所有行。什么是newTuples
?你的向量是在每次插入时通过复制创建的。使用指针和新的。@Pierreemanuellallemant,这是一个多么糟糕的建议…@SergeyA:我不知道std::move,ty.newTuples是我正在制作的新表中的所有行。你可能是对的,我最初使用集合是为了简单地消除重复项。现在更改它需要大量重构,可能不值得我1%的分数。你可能是对的,我最初使用集合作为消除重复项的简单方法。现在更改它将需要大量重构,可能不值得我1%的分数。这是有道理的,但对函数所用的时间没有影响。向量不是很大(最多20个项目)是有意义的,但对函数花费的时间没有影响。向量不是很大(最多20项)