我尝试了两件事:(下面的伪代码)
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)。我对这些结果感到困惑。有人可以向我解释为什么会这样吗?
谢谢!
答案 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