动态分配的数组或std :: vector

Opt*_*Opt 6 c++ optimization performance stl

我正在尝试优化我的C++代码.我使用动态分配的C++数组和使用std :: vector搜索互联网,并且通常看到有利于std :: vector的建议,并且两者之间的性能差异可以忽略不计.例如,在C++中使用数组或std :: vector,性能差距是多少?.

但是,我编写了一些代码来测试迭代数组/向量并为元素赋值的性能,我通常发现使用动态分配的数组比使用向量快近3倍(我事先指定了向量的大小) ).我用过g ++ - 4.3.2.

但是我觉得我的考试可能忽略了我不知道的问题,所以我很感激你对这个问题的任何建议.

谢谢

使用的代码 -

#include <time.h>
#include <iostream>
#include <vector>

using namespace std;

int main() {
  clock_t start,end;
  std::vector<int> vec(9999999);
  std::vector<int>::iterator vecIt = vec.begin();
  std::vector<int>::iterator vecEnd = vec.end();

  start = clock();
  for (int i = 0; vecIt != vecEnd; i++) {
    *(vecIt++) = i;
  }
  end = clock();
  cout<<"vector: "<<(double)(end-start)/CLOCKS_PER_SEC<<endl;

  int* arr = new int[9999999];
  start = clock();
  for (int i = 0; i < 9999999; i++) {
    arr[i] = i;
  }
  end = clock();
  cout<<"array: "<<(double)(end-start)/CLOCKS_PER_SEC<<endl;
}
Run Code Online (Sandbox Code Playgroud)

小智 21

在对C++容器进行基准测试时,启用大多数编译器优化非常重要.我在SO上的一些答案已经违背了这一点 - 例如,当运算符[]之类的内容没有内联时,函数调用开销可能非常重要.


rme*_*dor 5

只是为了好玩,尝试使用指针而不是整数索引迭代普通数组(代码看起来就像向量迭代,因为STL迭代器的点对于大多数操作看起来像指针算术).我敢打赌,在这种情况下,速度将完全相同.这当然意味着您应该选择矢量,因为它可以省去手动管理数组的麻烦.


jal*_*alf 5

关于标准库类的事情std::vector是,是的,天真地,它比原始数组要多得多.但是所有这些都可以由编译器简单地内联,这意味着如果启用了优化,它就会变得使用原始数组的代码基本相同.然后速度差异不可忽略但不存在.在编译时删除所有开销.

但这需要启用编译器优化.