调整向量的大小可能很慢?为了寻求提高软件速度的解决方案,我竭尽全力地尝试调整向量数组中向量的大小,并尝试调整向量*中向量的大小*。第二个似乎更快。即使我能感觉到原因,也没有明确的纯粹理性解释(我不想在数组中使用向量的保留空间,因为真实的向量很大)。在那儿 ?
这是我的测试程序(另一台使用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] 删除。
我来说两句