我正在写一个循环遍历文档 vector 的程序(特定类型,由m_docs指向)。每个文档都有一个属性,该属性是〜17000个零的 vector ,在某些情况下(循环点)会更改零。我有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);
    }
}

最佳答案

  • 这可能会更有效:
    std::map<string,int> cleanList
    

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

    最坏的情况是,getCleantList已经进行了复制,并且您获得了与const&绑定(bind)的临时文件(很好)。但是更有可能的是,您减少了内存分配,因为您不再复制包含字符串
  • 的映射
  • 另外,在这里查看搜索的效率:
    pos = distance(it, m_index.find(p.first));
    

    您调用了m_index变量。您可能需要改善位置(flat_map)或使用基于散列的容器(例如unordered_map)

  • 查看您的数据结构(至少m_index)

    关于c++ - For循环变慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27808702/

    10-09 06:09