清除矢量或定义新矢量,哪一个更快

时间:2013-10-04 19:57:23

标签: c++ vector

哪种方法更快,开销更少?

方法1:

void foo() {
  std::vector< int > aVector;
  for ( int i = 0; i < 1000000; ++i ) {
     aVector.clear();
     aVector.push_back( i );
  }
}

方法2:

void foo() {
  for ( int i = 0; i < 1000000; ++i ) {
     std::vector< int > aVector;
     aVector.push_back( i );
  }
}

你可能会说这个例子毫无意义!但这只是我的大代码的片段。总之,我想知道

是否更好

“创建一次向量并清除它以供使用”

“每次都创建一个新的矢量”

更新

感谢您的建议,我测试了两个,这里是结果

方法1:

 $ time ./test1

 real    0m0.044s
 user    0m0.042s
 sys     0m0.002s

方法2:

$ time ./test2

real    0m0.601s
user    0m0.599s
sys     0m0.002s

清除矢量更好。也许这有助于别人:)

2 个答案:

答案 0 :(得分:6)

clear()最有可能更快,因为您将为先前push_back()分配的内存保留在向量中,从而减少了分配的需要。

此外,每个循环也会取消1个构造函数调用和1个析构函数调用。

这都忽略了编译器优化器可能对此代码执行的操作。

答案 1 :(得分:0)

创建一个空向量的开销非常小。要增加向大尺寸的矢量可能非常昂贵,因为它每次都会增加一倍 - 因此1M入口矢量将具有由当前内容组成的15-20“副本”。

对于琐碎的基本类型,例如int,创建对象和销毁对象的开销“没有”,但对于任何更复杂的对象,您将不得不考虑构造和破坏该对象通常远远超过“将对象放入向量中”和“将其从向量中移除”。换句话说,每个对象的构造函数和析构函数都很重要。

对于“X或Y更快”的每一个,你真的需要根据你想要理解的环境进行基准测试,除非很明显一个明显比另一个明显更快(例如“线性搜索或二进制搜索” X元素“,其中线性搜索与X成比例,二分搜索是log2(x))。

此外,我对你的例子感到有些困惑 - 在一个向量中存储一个元素非常繁琐,并且在int x = i;上有相当大的开销 - 我认为你并不是真的意味着它作为基准。换句话说,你的特定比较不是很公平,因为明确构建1M向量比构造一个向量并填充它并清除它1M次更多。但是,如果你做了这样的测试:

void foo() {
  for ( int i = 0; i < 1000; ++i ) {
     std::vector< int > aVector;
     for(j = 0; j < 1000; j++)
     {
         aVector.push_back( i );
     }
  }
}

[以及对其他代码的相应更改],我希望结果非常相似。