数组和STL的效率问题
如下面代码所示:
[code=C/C++][/code]
#include <vector>
#include <iostream>
#include <time.h>
using std::cout;
using std::endl;
int main()
{
const int size=100000000; //size是1一个亿
std::vector<int> *vec=new std::vector<int>;
int *p=new int[size];
time_t t1=time(NULL);
for(int i = 0; i < size;++i)
p[i]=i;
time_t t2=time(NULL);
for(int i = 0;i <size; ++i)
v.push_back(i);
time_t t3=time(NULL);
cout << difftime(t2,t1) << endl;
cout << difftime(t3,t2) << endl;
delete v;
delete []p;
return 0;
}
输出的结果是 3秒 和58秒,相差了将近20倍,为什么相差这么多呢?
[解决办法]
int *p=new int[size];
你这个时间算的不对,你应该把这个用的时间也加进去
[解决办法]
这是肯定的。
STL是一套模版库。
其中要考虑的东西太多了,每种操作都有太多代码是为了兼容性而设计的。
这些代码都会使得CPU要执行的指令大量增加。
所以同样是输出一个值。
直接使用一个数组变量顶多几句汇编指令就能找到对应的值。
但是要使用STL库,就的经过非常多的中间指令。
所以当你使用大量数据进行测试时,自然就会出现性能上的差异了。
另外,即使都是STL的容器类型,不同容器因为实现不同,也是会出现性能和特性上的差异的。
[解决办法]
就基本类型的时间效率而言数组一般是优于vector的,但是vector里面有很多技巧,使得其在处理自定义类型时的性能损失并不是很大,有时甚至优于数组
另外就开发效率而言vector肯定是优于数组的,封装的那么多方法直接用就行
[解决办法]
- C/C++ code
#include <vector>#include <iostream>#include <time.h>using std::cout;using std::endl;int main(){ const int size=100000000; //size是1一个亿 /*原来 std::vector<int> *vec=new std::vector<int>; */ std::vector<int> *vec=new std::vector<int>(size); int *p=new int[size]; time_t t1=time(NULL); for(int i = 0; i < size;++i) p[i]=i; time_t t2=time(NULL); /* 原来 for(int i = 0;i <size; ++i) v.push_back(i); */ for(int i = 0;i <size; ++i) (*vec)[i]=i; time_t t3=time(NULL); cout << difftime(t2,t1) << endl; cout << difftime(t3,t2) << endl; delete vec; delete[] p; return 0;}
[解决办法]
STL中,不同的容器有不同过的特性和功能。你要去看看vector的原理, 内部其实也是维护了一个数组,但是当数组容量不够的时候会从新申请一个更大的数组,删除原来那个,因此vector的增加删除元素效率不高,你可以换list看看,list会快很多,但是对于楼主这个例子,如果是先对vector先分配好空间,两者的速度应该是差不多的。其实比较这个没什么意义,STL的容器就是为了提高程序员的效率封装好的容器的,加快开发速度
[解决办法]
如果没有增加以及删除操作,没必要用vector,就用数组就可以了,不要因为迷信C++prime而去把所有数组和char*修改为vector和string,要根据你具体的需求决定是用数组和char*还是vector和string
[解决办法]
题外话,如果用vecter,那么要知道怎样用才可以效率高些,不然还不如不用。为啥很多公司禁用stl?是因为效率低么?
是因为很多人把stl用的效率非常低,因此很多公司禁止,实际上stl用好的话,就算低也有限,不是什么太大影响