我以后再也不用STL了,效率太TM差劲。
以前我们学校ACM/ICPC社团Boss说STL效率差,要求我不用vector之类的工具。
我当时不信,后来测试了一下。因为ACM/ICPC用的最多的就是Linux + g++,所以我就在我的centOS机上测试了一下,结果太令人失望了。
除了少数情况下vector比普通数组快以外,几乎每次vector都比数组慢0.02s,我以后再也不用STL了!
#include <ctime>#include <cstdio>#include <cstdlib>#include <vector>#include <deque>#include <algorithm>using namespace std;class Timer { clock_t _start; const char* _obj;public: Timer(const char* obj) : _start(clock()), _obj(obj) {} ~Timer() { printf("The %s used %lfs!\n", _obj, static_cast<double>(clock() - _start) / CLOCKS_PER_SEC); }};void test_vector();void test_array();void test_deque();int main(){ test_vector(); test_array(); test_deque(); return 0;}void test_vector(){ Timer t("vector"); vector<int> vec; vec.reserve(10000000); srand(0); for (size_t i = 0; i != 10000000; ++i) vec.push_back(rand()); sort(vec.begin(), vec.end());}void test_deque(){ Timer t("deque"); deque<int> vec; srand(0); for (size_t i = 0; i != 10000000; ++i) vec.push_back(rand()); sort(vec.begin(), vec.end());}void test_array(){ Timer t("array"); int* arr = new int[10000000]; srand(0); for (size_t i = 0; i != 10000000; ++i) arr[i] = rand(); sort(arr, arr + 10000000); delete [] arr;}
#include"stdafx.h"#include <ctime>#include<vector>#include <iostream>#include <algorithm>using namespace std;void test_vector();void test_arrary();int main(){ test_vector(); test_arrary(); system("pause"); return 0;}void test_vector(){ clock_t start,end; start=clock(); vector<int>vec; vec.reserve(10000); srand(0); for(size_t i=0;i!=10000;++i) vec.push_back(i); sort(vec.begin(),vec.end()); end=clock(); cout<<"vector所需时间:"<<static_cast<double>(end-start)/CLOCKS_PER_SEC<<endl;}void test_arrary(){ clock_t start,end; start=clock(); int *arrary=new int[10000]; srand(0); for(int i=0;i!=10000;++i) arrary[i]=rand(); sort(arrary,arrary+10000); delete[]arrary; end=clock(); cout<<"arrary所需时间:"<<static_cast<double>(end-start)/CLOCKS_PER_SEC<<endl;}
[解决办法]
对于ACM这种极品比赛来说,STL使用要极其谨慎。
//输出PROG中有但LIST中没有的文本行,即集合PROG-LIST#include <stdio.h>#include <string.h>#include <stdlib.h>#include <search.h>#define MAXLINES 1000000#define MAXCHARS 256char buf[MAXLINES][MAXCHARS];char P[256]="PROG";//程序Program需要的文件列表char L[256]="LIST";//dir /b /s生成的实际文件列表ListFILE *fp,*fl;int c,n,L1,hh;int ignore_case=0;char ln[MAXCHARS];int icompare(const void *arg1,const void *arg2) { return stricmp((char *)arg1,(char *)arg2);}int compare(const void *arg1,const void *arg2) { return strcmp((char *)arg1,(char *)arg2);}int main(int argc,char **argv) { if (argc>1) strcpy(P,argv[1]);//命令行参数1覆盖PROG if (argc>2) strcpy(L,argv[2]);//命令行参数2覆盖LIST if (argc>3) ignore_case=1;//若存在命令行参数3,忽略大小写 if ((fl=fopen(L,"rt"))==NULL) { fprintf(stderr,"Can not open %s\n",L); fprintf(stderr,"Usage: %s [PROG] [LIST] [-i]\n",argv[0]); return 1; } if ((fp=fopen(P,"rt"))==NULL) { fclose(fl); fprintf(stderr,"Can not open %s\n",P); return 2; } n=0; hh=0; while (1) { if (fgets(ln,MAXCHARS,fl)==NULL) break;// hh++; L1=strlen(ln)-1; if ('\n'!=ln[L1]) {//超长行忽略后面内容 fprintf(stderr,"%s Line %d too long(>%d),spilth ignored.\n",L,hh,MAXCHARS); while (1) { c=fgetc(fl); if ('\n'==c || EOF==c) break;// } } while (1) {//去掉行尾的'\n'和空格 if ('\n'==ln[L1] || ' '==ln[L1]) { ln[L1]=0; L1--; if (L1<0) break;// } else break;// } if (L1>=0) { strcpy(buf[n],ln); n++; if (n>=MAXLINES) { fclose(fl); fclose(fp); fprintf(stderr,"%s up to %d lines",L,MAXLINES); return 3; } } } fclose(fl); if (ignore_case) qsort(buf,n,MAXCHARS,icompare); else qsort(buf,n,MAXCHARS,compare); hh=0; while (1) { if (fgets(ln,MAXCHARS,fp)==NULL) break;// hh++; L1=strlen(ln)-1; if ('\n'!=ln[L1]) {//超长行忽略后面内容 fprintf(stderr,"%s Line %d too long(>%d),spilth ignored.\n",P,hh,MAXCHARS); while (1) { c=fgetc(fp); if ('\n'==c || EOF==c) break;// } } while (1) {//去掉行尾的'\n'和空格 if ('\n'==ln[L1] || ' '==ln[L1]) { ln[L1]=0; L1--; if (L1<0) break;// } else break;// } if (L1>=0) { if (ignore_case) { if (NULL==bsearch(ln,buf,n,MAXCHARS,icompare)) printf("%s\n",ln); } else { if (NULL==bsearch(ln,buf,n,MAXCHARS,compare)) printf("%s\n",ln); } } } fclose(fp); return 0;}
[解决办法]
稍作修改后,
void test_vector(){ Timer t("vector"); vector<int> vec; vec.reserve(10000000); srand(0); for (size_t i = 0; i != 10000000; ++i) vec[i] = rand(); sort(vec.begin(), vec.end());}
[解决办法]
之前的结果是 The vector used 11.688000s!
当然了,每次结果有差别 但足以说明问题
push_back 进行了很多运算, 这个操作就已经不能与你arr[i]=rand() 等价了
应该可以看出, 时间都是在这个函数里面消耗的
[解决办法]
10000000次的if (size()+1 > capacity()) 和 ++m_size 只用了0.02s
编译器优化的确非常可怕
不过听说acm不给开优化?
[解决办法]
楼主一看就是没出社会的人,没有任何软件工程的概念。
不过也正常,在校的时候都是这个样子的。
------解决方案--------------------
我不知道 operator[] 是不是stl标准里面的, 因为我看ms的实现是有这个方法的,
至于2,我也没对那个函数做任何修改
我的代码和你的做的事情是一样的
for (size_t i = 0; i != 10000000; ++i) vec[i] = rand();
[解决办法]