C++ For循环速度变慢

C++ For循环速度变慢,c++,for-loop,optimization,C++,For Loop,Optimization,我正在编写一个程序,它循环遍历文档向量(特定类型,由m_docs指出)。每个文档都有一个属性,该属性是约17000个零的向量,在某些情况下(循环点)会发生更改。我有大约3200个文件。我的问题是,最初的100份文件处理得相当快,然后它真的变慢了。我想了解它为什么会变慢,并知道如何修复它(或至少优化它) 有关代码的部分: for (int k = 0; k < m_docs->size(); k++) { int pos; std::map<std::string

我正在编写一个程序,它循环遍历文档向量(特定类型,由m_docs指出)。每个文档都有一个属性,该属性是约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);
    }
}
for(int k=0;ksize();k++){
int pos;
std::map::iterator it=m_index.begin();
std::map cleanList=(*m_docs)[k].getCleantList();
用于(自动常量和p:cleanList){
pos=距离(it,m_索引查找(p.first));
浮球重量=计算结果(p.first)*计算结果(p.first,(*m_docs)[k]);
(*m_docs)[k].setCoord(位置,重量);
}
}
  • 这可能更有效:

    std::map<string,int> cleanList
    
    您调用了变量
    m_index
    。您可能需要改进局部性(平面映射)或使用基于散列的容器(例如无序映射)


  • 在做任何其他事情之前,请检查您的数据结构(至少是m_索引的
    m

    ,您运行的是优化的构建还是“调试”的非优化构建?听起来您可能会耗尽主内存,现在,您正在将内存分页到磁盘或从磁盘分页。该
    it
    定义就像是
    auto
    的教科书用例……在某个时候,您可能正在重新使用动态内存,而不是从内存池中获取新块。如果动态内存是碎片化的,你的程序会变慢。你正在制作大量的拷贝。您经常使用
    (*m_docs)[k]
    。(还有什么是
    (*m_docs)[k]
    ?)您正在哈希表中搜索大量的。您没有显示的是函数
    computedf
    computeTf
    。您是否做过任何性能测试以查看代码在哪里陷入困境?
    std::map<string,int> const& cleanList
    
    pos = distance(it, m_index.find(p.first));