For循环变慢
For loop slows down
我正在编写一个循环遍历文档向量(特定类型,由 m_docs 指出)的程序。每个文档都有一个属性,它是一个由 ~17000 个零组成的向量,这些零在某些情况下会发生变化(循环点)。我有 ~3200 个文档。我的问题是前一百个文档处理得相当快,然后它真的变慢了。我想了解它为什么变慢,并想知道如何修复它(或至少优化它)
有问题的部分代码:
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);
}
}
这可能更有效:
std::map<string,int> cleanList
进入
std::map<string,int> const& cleanList
最坏的情况是,getCleantList
已经制作了副本,并且您得到一个绑定到 const& 的临时文件(这很好)。但更有可能的是,您减少了内存分配,因为您不再复制包含字符串
的映射
另外,看这里的搜索效率:
pos = distance(it, m_index.find(p.first));
您调用了变量m_index
。您可能需要改进局部性 (flat_map) 或使用基于哈希的容器 (unordered_map 例如)
检查您的数据结构(至少 m_index
)
我正在编写一个循环遍历文档向量(特定类型,由 m_docs 指出)的程序。每个文档都有一个属性,它是一个由 ~17000 个零组成的向量,这些零在某些情况下会发生变化(循环点)。我有 ~3200 个文档。我的问题是前一百个文档处理得相当快,然后它真的变慢了。我想了解它为什么变慢,并想知道如何修复它(或至少优化它)
有问题的部分代码:
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);
}
}
这可能更有效:
std::map<string,int> cleanList
进入
std::map<string,int> const& cleanList
最坏的情况是,
getCleantList
已经制作了副本,并且您得到一个绑定到 const& 的临时文件(这很好)。但更有可能的是,您减少了内存分配,因为您不再复制包含字符串 的映射
另外,看这里的搜索效率:
pos = distance(it, m_index.find(p.first));
您调用了变量
m_index
。您可能需要改进局部性 (flat_map) 或使用基于哈希的容器 (unordered_map 例如)
检查您的数据结构(至少 m_index
)