我刚刚写了一个很小的C ++程序,只是为了理解向量如何与内存一起工作以及在运行时发生了什么。
有我的代码:
#include <iostream>
#include <cstdio>
#include <ctime>
#include <vector>
int main(){
clock_t start, end;
int x;
std::vector<int> a(5, 100);
start = clock();
for(int i = 0 ; i <= 900000000 ; i++){
x = a[0];
x = a[1];
x = a[2];
x = a[3];
x = a[4];
}
end = clock();
clock_t duration = end - start;
double durationPerSec = duration / (double)CLOCKS_PER_SEC;
std::cout << "Run-time : " << durationPerSec << std::endl;
return 0;
}
我得到了这个输出:
运行时间:18.7843
当我通过动态数组替换向量来编写相同的代码时,运行时间更加可接受:
运行时间:2.9526
我知道这段代码非常愚蠢,但我想知道为什么运行时间这么长时间使用向量?那是因为我以错误的方式使用它还是因为有些东西我不明白?
感谢您的回复。
答案 0 :(得分:1)
我用g++ -O0 a.cc
运行并获取
Run-time : 18.99
但是如果我使用g++ -O2 a.cc
Run-time : 0
要更加激励,我用time ./a.out
time ./a.out
Run-time : 0
real 0m0.009s
user 0m0.002s
sys 0m0.002s
我将循环更改为
for(int i = 0 ; i <= 900000000 ; i++){
a[0] = i ;
a[1] = i + a[0];
a[2] = a[1] + a[2];
a[3] = i + a[1] + a[2];
a[4] = i + a[1] + a[2] + a[3];
x = a[0];
x = a[1];
x = a[2];
x = a[3];
x = a[4];
}
然后g++ -O2
的结果是
time ./a.out
Run-time : 1.81
real 0m1.817s
user 0m1.811s
sys 0m0.001s
答案 1 :(得分:0)
您应该在启用优化的情况下进行衡量。
operator[]
是会员功能。当您使用[0]
访问元素时,它实际上会通过一个函数,因此有更多的指令要执行,尽管符号相同。在调试中,会有可衡量的开销。在发布时,它通常是无法测量的。