首页 IP地址查询 | Alexa排名查询 | 手机归属地查询
设为首页 收藏本站
  • 网络编程网络编程
  • 软件编程软件编程
  • 数据库技术数据库技术
  • 编程学院
  • 业界资讯 业界资讯
  • 源码中心源码中心
  • 会员中心会员中心
  • 页面导航: 首页C++编程STL → C风格字符串与标准库类型string性能比较

    C风格字符串与标准库类型string性能比较

    发布:微骆驼 发布日期:2009-04-07 字体:[增加 减小] 类型:转载

    看c++ primer上说,推荐在c++程序中使用string(c++准备库中一个类),而是不使用从c集成而来的c风格字符串(以null结束的字符数组),原因如下:
    1)使用string安全,不用程序员管理内存分配释放
    2)程序写起来比较简洁、方便、不容易出错
    3)效率比较高

    对于前2点,感觉是没什么问题,对于第三点就不是很明白,呵呵,以前一直以为后者比前者差呢。
    书上有例子程序:
    #include <iostream>  
    #include <windows.h>
    #include <string>
    using   namespace std;

    int main()  
    {
        const size_t size = 20;   
        char pc[1000000];
       
        for (size_t i = 0; i != 10 - 1; ++i)
        {
            pc[i] = ' ';
        }
        pc[999999] = '\0';
       
        const size_t len = strlen(pc);
        size_t time = GetTickCount();
        for(size_t ix = 0; ix != size; ++ix)
        {
            char *pc2 = new char[len + 1];
            strcpy(pc2, pc);
            if (strcmp(pc2, pc))
            {       
                delete [] pc2;
            }
        }
       
        time = GetTickCount() - time;
        cout <<"C style time is: " <<time <<" ms." <<endl;
       
       
        string str (1000000, ' ');
        time = GetTickCount();
        for(int ix1 = 0; ix1 != size; ++ix1)
        {
            string str2 = str;
            if (str2 != str);
        }
        time = GetTickCount() - time;
        cout <<"C++ style time is: " <<time <<" ms." <<endl;
       
       
        return   0;
    }  

    运行结果:
    c-style time is:93ms
    c++ style time is:32ms
    呵呵,很明显说明了string类的优势。但是自己不是很明白其中的道理,因为c++类的底层还是用c写的。
    看了bbs上很多的说法,过多的说这个测试程序不是很合理,string str2 = str1并不是深层拷贝,不存在内存字节复制的问题。具体原因我也不是很清楚,不过我始终认为c-style的运行效率要高。
    我国我还是觉得使用string开发效率倒是提高不少,说以我还是比较喜欢用string的。

     

    昨天本人发了“我是教条主义者,请大家将标准C++进行到底”的帖子,网友对其中的一个细节---char *和string的效率---提出了不同看法,现回答如下:
    Cybergate:您让我看《The c++ programming language题解》,但没有指明是那个地方,我姑且猜测是练习20。1(不知看对了没有)。

    //两个string版本的
    string dotconnect (string const &a, string const &b)
    {
    return a + '.' + b;
    }


    string dotconnect (string const &a, string const &b)
    {
    string result(a.size() + b.size() + 1, '.');
    result.replace(0, a.size(), a);
    result.replace(a.size() + 1, b.size(), b);
    reutrn result;
    }

    //C风格版本的
    char * dotconnect (char const *a, char const *b)
    {
    size_t alen = strlen(a), blen = strlen(b);
    char *result = (char *) malloc(alen + blen + 2);
    memcpy (result, a, alen);
    result[alen] = '.';
    memcpy (result + alen + 1, b, blen);
    result[alen + blen + 2] = '\0';
    return result;
    }

    作者提到,c风格的版本比string的第二个版本快了大约4倍,但是,正如作者所暗示的,这是一个不公平的测试,下面是另外一个更加不公平的测试,来自《C++ Primer》p82练习3。14。

    int main ()
    {
    int errors = 0;
    const char *pc = "a very larg literal string";

    for (int ix = 0; ix < 1000000; ++ ix)
    {
    int len = srlen (pc);
    char *pc2 = new char[len + 1];
    strcpy (pc2, pc);
    if (strcmp (pc2, pc))
    ++ errors;
    delete pc2;
    }
    }


    int main ()
    {
    int errors = 0;
    string str("a very larg literal string");
    for (int ix = 0; ix < 1000000; ++ ix)
    {
    int len = str.size();
    string str2 = str;
    if (str != str2)
    ++ errors;
    }
    }
    这里的string版本比char *版本的快两倍。
    不公平的大约是这两条语句。
    int len = strlen(pc);
    int len = str.size();
    由于string显式存储长度,而strlen通过遍历整个串来确定长度,所以在执行了1000000次之后,两者的快慢显示出来了。
    关于效率的问题,《题解》181面有着较为详细的分析,经过一番考虑后,我认为使用string代替char *,不仅能让我们避免很多麻烦,而且也不会丧失效率,甚至能提高我们的程序的效率(当然,如果您能确定不会出错而且效率问题很重要的话,我也不反对您使用char *)。
    实际上各个不同的实现也有着不同的效率,原则上string可以有着非常高的效率,所以,不要简单的认为string的效率不如char *.
    再次提倡大家使用 string。同是欢迎任何对我的批评。

    ACM的赛手们用来竞赛是很少用STL的,它们知道效率绝对比不上一段优秀的C代码

    最后还有一点,对于某些STL实现,如果=两边内容一样, STL将不进行复制.

    如果你一定要比较, 第一段代码应该改进成:

    int main ()
    {
    int errors = 0;
    const char *pc = "a very larg literal string";
    int len = srlen (pc);
    char *pc2 = new char[len + 1];
    strcpy (pc2, pc);
    for (int ix = 0; ix < 1000000; ++ ix)
    {
    if (strcmp (pc2, pc))
    ++ errors;
    delete pc2;
    }
    }

    你再比比?

    就运行速率而言, C绝对比C++快, 但前提是你必须是一个较好的并有一定算法分析基础的C程序员.
    ---------------------------------------------------------------

    抱歉,请把delete pc2也提出到循环体外面.
    ---------------------------------------------------------------

    这样测试吧,

    分别在函数中的开始和结束加入GetTickCount获取时间,看看到底谁用的时间多。但个人认为,代码量大并不是主要因素,string由字符组成,我们看到的string只不过是一个封装体,所以我认为从效率上说,是char*快的。这就是方便与效率的矛盾。

    总结:

    要是真的比效率,对于能力强的C程序员,那么会发现C的char 比 C++中的string要快,但对于普通程序员string的效率会高些,操作也方便,相对整个工程效率要高


    Tags: string 效率
    为配合网络严查,文章评论将关闭敬请谅解.
    同 类 文 章
    最 近 更 新
    热 点 排 行