为什么调整向量*(在向量*数组中)的指针的大小比向量(在向量数组中)的指针大小更快?

圣马丁

调整向量的大小可能很慢?为了寻求提高软件速度的解决方案,我竭尽全力地尝试调整向量数组中向量的大小,并尝试调整向量*中向量的大小*。第二个似乎更快。即使我能感觉到原因,也没有明确的纯粹理性解释(我不想在数组中使用向量的保留空间,因为真实的向量很大)。在那儿 ?

这是我的测试程序(另一台使用debian 8的Lenovo ThinkCenter i5的结果可能有所不同:我不想停止的另一项任务正在运行):

int main (int argc, char* argv []) {
  const int n = 10;
  const int s2 (10000);
  {
    std::vector<int> tab [n];
    clock_t begt, endt;
    begt = clock ();
    {
      std::vector<int>* pv ((std::vector<int>*) tab);
      for (int i (0); i < n; ++i, ++pv) {
        pv->resize (s2);
      }
    }
    endt = clock ();
    std::cout << "vector resize duration == " << (unsigned int) (endt - begt) <<  " ticks" << std::endl;
  }

  {
    std::vector<int> *tab [n];
    for (int i (0); i != n; ++i) {
      tab [i] = new std::vector<int> ();
    }
    clock_t begt, endt;
    begt = clock ();
    {
      std::vector<int>** pv ((std::vector<int>**) tab);
      for (int i (0); i < n; ++i, ++pv) {
        (*pv)->resize (s2);
      }
    }
    for (int i (0); i != n; ++i) {
      delete tab [i];
    }
    endt = clock ();
    std::cout << "*vector resize duration== " << (unsigned int) (endt - begt) <<  " ticks" << std::endl;
  }
  return 0;
}

和典型结果:

vector resize duration == 114 ticks
*vector resize duration== 78 ticks
山姆·瓦尔沙夫奇克

我对所声称的观察结果感到好奇,并能够自己复制它们。然后,我交换了两个替代实现,现在表被翻转了。std::vector<int> *tab [n]现在首先执行版本比现在执行第二版本慢得多。

解释很简单。C ++库重用了分配的内存。当您使用内存时,可以直接通过new通过自己为容器中的值分配内存,然后再释放它,C ++库不会将释放的内存释放回操作系统,而是在下一次重用它需要更多的内存,而不必要求操作系统更多。没有法律说这是C ++库必须执行的操作,但这是现代C ++实现的典型行为。

所以,这很简单。您的第一个基准测试包括从操作系统分配大量内存所需的时间。C ++第一次需要这些向量的内存,而这花费了额外的时间。您的第二个基准测试代码部分不必这样做,因为该内存已由第一个基准测试分配,然后释放。因此,第二个基准测试只是导致您的C ++库重用了它已经拥有的但未使用的内存(通过查看syscall跟踪就很明显)。

简单地第二次重复第一个基准的典型结果:

vector resize duration == 191 ticks
vector resize duration == 48 ticks
*vector resize duration== 63 ticks

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章