矢量初始化比数组慢...为什么?

时间:2009-10-23 17:50:29

标签: c++ optimization vector performance

我尝试了两件事:(下面的伪代码)

int arr[10000];
for (int i = 0; i < 10000; i++)
{
   for (int j = 0; j < 10000; j++)
   {
       arr[j] = j;
   }
}

vector<int> arr(10000);
for (int i = 0; i < 10000; i++)
{
   for (int j = 0; j < 10000; j++)
   {
       arr[j] = j;
   }
}

我运行了两个程序并使用“time”shell命令对其进行了计时。程序1在5秒内运行,程序2在30秒内运行。我打开了编译器优化的两个程序,两个程序大约在同一时间运行(0.38s)。我对这些结果感到困惑。有人可以向我解释为什么会这样吗?

谢谢!

6 个答案:

答案 0 :(得分:16)

对于模板,下标是使用operator []完成的。关闭优化后,通常会将其作为一个真正的函数调用生成,这会增加很多开销,就像订阅数组一样简单。当您打开优化时,它会内联生成,从而消除了这种开销。

答案 1 :(得分:8)

在调试模式下,std::vector的实现提供了大量的运行时检查以方便使用。此检查不适用于本机阵列。例如,在VC2008中,如果您在调试模式下编译vector示例,则range-checking的情况下会operator[] 甚至

答案 2 :(得分:5)

如果您的非优化矢量实现正在执行边界检查,那将解决差异。

答案 3 :(得分:4)

这些都是很好的答案,但你可以通过一种快速的方式找到答案。

你的性能差异为6比1,对吧?只需运行慢速按钮并点击“暂停”按钮即可。然后看一下调用堆栈。概率是6分(83%)中的5分,您将看到它们如何花费这25秒的额外时间。做几次以获得你想要的洞察力。

对于优化的情况,对程序1执行相同的操作。由于它比优化程序慢13倍,您将看到每个“暂停”的原因,概率为12/13 = 92%。

这是this technique的应用程序。

答案 4 :(得分:0)

因为你写矢量arr(10000);你创建一个对象,调用它的函数......什么时候它会比你创建int arr [10000]时慢;

答案 5 :(得分:0)

在您的示例中,阵列位于堆栈中。访问阵列中的数据涉及访问堆栈上的数据。那很快。

另一方面,当vector在堆栈上时,std::vector的数据被分配到其他地方(默认情况下,它通过std::allocator在堆上分配)。访问vector中的数据涉及访问堆上的数据。这比访问堆栈上的数据要慢得多。

但是你会得到一些性能损失的东西。 std::vector是可增长的,而常规数组则不是。此外,std::vector的大小不必是编译时常量,而堆栈上的数组大小也是如此。堆分配的数组(通过operator new[])不必是编译时常量。如果将堆分配的数组与std::vector进行比较,您会发现性能更接近。

int* arr = new int[10000];
for (int i = 0; i < 10000; i++)
{
   for (int j = 0; j < 10000; j++)
   {
       arr[j] = j;
   }
}

delete[] arr; // std::vector does this for you