我正在编写一个循环遍历文档向量的程序(特定类型,由m_docs指向)。每个doc都有一个属性,它是〜17000个零的向量,在某些情况下(循环点)会改变。我有~3200个文档。我的问题是前100个文档处理得相当快,然后它真的变慢了。我想了解为什么它会变慢,并知道如何解决它(或至少优化它)
有问题的代码部分:
for (int k = 0; k < m_docs->size(); k++) {
int pos;
std::map<std::string, std::vector<std::pair<int, int> > >::iterator it = m_index.begin();
std::map<string,int> cleanList = (*m_docs)[k].getCleantList();
for (auto const& p : cleanList) {
pos = distance(it, m_index.find(p.first));
float weight = computeIdf(p.first) * computeTf(p.first, (*m_docs)[k]);
(*m_docs)[k].setCoord(pos, weight);
}
}
答案 0 :(得分:2)
这可能更有效:
std::map<string,int> cleanList
进入
std::map<string,int> const& cleanList
最糟糕的情况是,getCleantList
已经制作了副本,并且你得到了一个const和amp; (很好)。但更有可能的是,你因为你不再复制包含字符串的地图而抽取内存分配
另外,请看一下搜索的效率:
pos = distance(it, m_index.find(p.first));
您调用变量m_index
。您可能需要改进局部性(flat_map)或使用基于散列的容器(例如unordered_map)
检查您的数据结构(至少针对m_index
)