首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

小弟我以后再也不用STL了,效率太TM差劲

2012-04-15 
我以后再也不用STL了,效率太TM差劲。以前我们学校ACM/ICPC社团Boss说STL效率差,要求我不用vector之类的工具

我以后再也不用STL了,效率太TM差劲。
以前我们学校ACM/ICPC社团Boss说STL效率差,要求我不用vector之类的工具。
我当时不信,后来测试了一下。因为ACM/ICPC用的最多的就是Linux + g++,所以我就在我的centOS机上测试了一下,结果太令人失望了。

除了少数情况下vector比普通数组快以外,几乎每次vector都比数组慢0.02s,我以后再也不用STL了!

C/C++ code
#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;}


[解决办法]
有些地方用stl,开发时间可以减少0.02*???????????????s
[解决办法]
vector<int> vec;
vec.resize(10000000);
srand(0);
generate(vec.begin(),vec.end(),rand);
sort(vec.begin(), vec.end());

======
这样就会差 0.2秒了.
[解决办法]
探讨

vector<int> vec;
vec.resize(10000000);
srand(0);
generate(vec.begin(),vec.end(),rand);
sort(vec.begin(), vec.end());

======
这样就会差 0.2秒了.

[解决办法]
探讨

vector<int> vec;
vec.resize(10000000);
srand(0);
generate(vec.begin(),vec.end(),rand);
sort(vec.begin(), vec.end());

======
这样就会差 0.2秒了.

[解决办法]
没有可比性
[解决办法]
看需要。
如果高效的话,用汇编,或许能写出更高效的。
如果对于普通的应用,stl减少的开发时间是不言而喻的。
[解决办法]
>>以前我们学校ACM/ICPC社团Boss说STL效率差

对于ACM这类问题,一味的追求效率,STL确实是无用武之处.但是在实际的开发中,情况远比ACM问题复杂,而这0.02秒的效率差别也绝对不会成为热点.比如,如果需要频繁地reverse + push_back那只能说明这个算法的实现存在严重的不足
[解决办法]
既然知道大小,那么直接
vector<int> vec(10000000);
[解决办法]
for (size_t i = 0; i != 10000000; ++i)
vec.push_back(rand());

vec.push_back 10000000 次的函数调用开销起作用了,你arr[i]是没有函数调用的开销的
[解决办法]
倒不至于再也不用stl吧,效率和实用折中考虑比较好
[解决办法]
acm的话 还是用C
------解决方案--------------------


探讨

引用:

vector<int> vec;
vec.resize(10000000);
srand(0);
generate(vec.begin(),vec.end(),rand);
sort(vec.begin(), vec.end());

======
这样就会差 0.2秒了.





你的代码。

[解决办法]
如果你频繁的加数据,不用vector,你就频繁的malloc?
[解决办法]
0.02秒对于前面一个1秒来说基本可以忽略
[解决办法]
因噎废食!
[解决办法]
C/C++ code
#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使用要极其谨慎。

探讨

引用:

因噎废食!

我仅仅是开个玩笑而已,大家难道没有看出vector的效率与数组基本上是一样的吗?

[解决办法]
哦,原来我以前根本没分清主次思想,所以才导致玩了一年ACM就退出了。惭愧惭愧。。。

探讨

引用:

对于ACM这种极品比赛来说,STL使用要极其谨慎。

引用:

引用:

因噎废食!

我仅仅是开个玩笑而已,大家难道没有看出vector的效率与数组基本上是一样的吗?


ACM比的不是代码效率,是算法效率,真正影响成绩的是写代码的速度,不是代码执行速度。

[解决办法]
探讨

>>以前我们学校ACM/ICPC社团Boss说STL效率差

对于ACM这类问题,一味的追求效率,STL确实是无用武之处.但是在实际的开发中,情况远比ACM问题复杂,而这0.02秒的效率差别也绝对不会成为热点.比如,如果需要频繁地reverse + push_back那只能说明这个算法的实现存在严重的不足

[解决办法]
探讨

引用:

>>以前我们学校ACM/ICPC社团Boss说STL效率差

对于ACM这类问题,一味的追求效率,STL确实是无用武之处.但是在实际的开发中,情况远比ACM问题复杂,而这0.02秒的效率差别也绝对不会成为热点.比如,如果需要频繁地reverse + push_back那只能说明这个算法的实现存在严重的不足

ACM毛一味追求效率。只要AC就行。
vect……

[解决办法]
吐槽new/malloc的就算了吧,LZ有reserve了。
[解决办法]
其实像map之类,C语言都可以实现,而且也简单灵活
[解决办法]
探讨

其实像map之类,C语言都可以实现,而且也简单灵活

[解决办法]
你给我简单实现个看看?光红黑树那里就够你折腾的了,还简单灵活。。。。
[解决办法]


木有一个人说到点子上.
[解决办法]
C/C++ code

//输出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;}
[解决办法]
稍作修改后,
 
C/C++ code
 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,我也没对那个函数做任何修改

我的代码和你的做的事情是一样的

探讨

1.你这个代码肯定错了,请参考《Exceptional C++ Style》。
2.sort在对一个空容器做排序操作。


引用:

稍作修改后,
C/C++ code

void test_vector()
{
Timer t("vector");
vector<int> vec;
vec.reserve(1000000……

[解决办法]
我才弄明白,你的意思是
C/C++ code
for (size_t i = 0; i != 10000000; ++i)  vec[i] = rand();
[解决办法]
探讨

我才弄明白,你的意思是
C/C++ code
for (size_t i = 0; i != 10000000; ++i)
vec[i] = rand();

相当于什么也没做,之后vec里面啥也没有 对吧?
要是这样认为,我就没办法了

引用:

1.你这个代码肯定错了,请参考《Exceptional C++ Style》。
2.sort在对一个空容器……

[解决办法]
dtgdf2001/nice_cxf,

嗯,我的错了
[解决办法]
因噎废食!
[解决办法]
嗯,要是崩溃就不会闹这么个笑话了 

探讨

引用:

我才弄明白,你的意思是
C/C++ code
for (size_t i = 0; i != 10000000; ++i)
vec[i] = rand();

相当于什么也没做,之后vec里面啥也没有 对吧?
要是这样认为,我就没办法了

引用:

1.你这个代码肯定错了,请参考《Exceptional C++ Sty……

[解决办法]
探讨

引用:
木有一个人说到点子上.


确实是,我再次声明一遍,这个帖子是我开的玩笑,主要为了证明2点:

1.认为vector一定慢是片面的。
2.有类库却不用是很愚蠢的。

[解决办法]
LZ 我恨你,
你开个玩笑 让我成了笑话

探讨

引用:
木有一个人说到点子上.


确实是,我再次声明一遍,这个帖子是我开的玩笑,主要为了证明2点:

1.认为vector一定慢是片面的。
2.有类库却不用是很愚蠢的。

热点排行