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

  • 本文关键字:向量 数组 调整 更快 指针 c++ stdvector
  • 更新时间 :
  • 英文 :


调整向量大小可能很慢?为了寻找提高软件速度的解决方案,我尝试调整向量数组中的向量大小,以及向量数组中向量*的大小*第二个似乎更快。即使我能感觉到原因,我也没有一个明确的纯理性解释(我不想对数组中的向量使用保留,因为实数是巨大的(。有吗?

这是我的测试程序(在另一个联想ThinkCenter i5和debian 8上的结果可能会有所不同:另一个我不想停止的任务正在运行(:

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

最新更新