c ++矢量性能非直观的结果?

时间:2011-10-16 12:44:40

标签: c++ performance visual-studio-2010

我正在摆弄VS2010中的性能向导,即测试仪器(函数调用计数和时序)。

在了解了C ++ STL中的向量之后,我决定看看有关填充100万个整数向量的性能的信息:

#include <iostream>
#include <vector>

void generate_ints();

int main() {
  generate_ints();
  return 0;
}

void generate_ints() {
  typedef std::vector<int> Generator;
  typedef std::vector<int>::iterator iter;
  typedef std::vector<int>::size_type size;

  Generator generator;

  for (size i = 0; i != 1000000; ++i) {
    generator.push_back(i);
  }
}

我得到的是:上述2402.37毫秒的经过时间。但我了解到,当向量耗尽时,向量必须调整自身大小,因为它们在内存中是连续的。因此,我认为通过添加上述内容可以获得更好的性能:

generate.reserve(1000000);

然而,这使程序的执行时间加倍到大约5000毫秒。这是函数调用的屏幕截图,左侧没有上面的代码行,右侧有。我真的不明白这个结果,如果你知道如果用一个吨来填充它,我学到了如何定义矢量容量对我来说没有意义是一件好事。指定保留基本上使大多数函数调用加倍。

http://imagebin.org/179302

2 个答案:

答案 0 :(得分:6)

从您发布的屏幕截图中,看起来您正在编译而没有优化,这会使您执行的任何基准测试无效。

在关注性能时进行基准测试,当您关心性能时,按下编译器上的“更快”按钮,并启用优化。

告诉编译器变慢,然后担心它比预期慢,这是毫无意义的。当您插入reserve调用时,我不确定为什么代码会变得,但是在调试版本中,会插入大量运行时检查以捕获更多错误,并且很有可能reserve调用会导致执行更多此类检查,从而减慢代码速度。

启用优化并查看会发生什么。 :)

答案 1 :(得分:0)

您是否在发布配置下执行了所有基准测试?

另外,尝试在探查器之外运行,以防你遇到一些探查器引起的工件(在代码中添加手动时间测量 - 你可以使用clock())。

另外,您是否有机会输入错字并实际调用resize而不是reserve