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);
    }
}
  1. 这可能更有效:

    std::map<string,int> cleanList
    

    进入

    std::map<string,int> const& cleanList
    

    最坏的情况是,getCleantList 已经制作了副本,并且您得到一个绑定到 const& 的临时文件(这很好)。但更有可能的是,您减少了内存分配,因为您不再复制包含字符串

  2. 的映射
  3. 另外,看这里的搜索效率:

    pos = distance(it, m_index.find(p.first));
    

    调用了变量m_index。您可能需要改进局部性 (flat_map) 或使用基于哈希的容器 (unordered_map 例如)

检查您的数据结构(至少 m_index