对于循环减慢

时间:2015-01-06 22:57:26

标签: c++ for-loop optimization

我正在编写一个循环遍历文档向量的程序(特定类型,由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);
    }
}

1 个答案:

答案 0 :(得分:2)

  1. 这可能更有效:

    std::map<string,int> cleanList
    

    进入

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

    最糟糕的情况是,getCleantList已经制作了副本,并且你得到了一个const和amp; (很好)。但更有可能的是,你因为你不再复制包含字符串的地图而抽取内存分配

  2. 另外,请看一下搜索的效率:

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

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

  3. 检查您的数据结构(至少针对m_index