Tauruser

Enjoy Every Day
posts - 34, comments - 95, trackbacks - 0, articles - 5
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
  今天在看c++ primer书中挺到C风格字符串与标准库string类型的效率问题。推荐使用string类型,不但因为其更安全,且因其效率更高。最后有提到一个数据。
  “平均来说,使用string类型的程序执行速度要比用C风格字符串的快很多,在我们用了五年的PC机上其平均执行速度分别是:
  user   0.47    #string class
        user   2.55    #C-style haracter string”
  对这个数据表示相当的惊讶。于是自已写了个程序,测试一下两个类型的效率。
#include <iostream>
#include 
<string>
#include 
<ctime>
using namespace std;
const size_t retime=1000000;
int main()
{
    clock_t start, finish;
    start
=clock();
    
const char *pc="a very long literal string";
    
const size_t len = strlen(pc);
    
for(size_t ix=0; ix!=retime;++ix)
    
{
        
char *pc2= new char[len+1];
        strcpy(pc2,pc);
        
if(strcmp(pc2,pc))
          ;
        delete []pc2;
    }

    finish
=clock();
    cout
<<"C-style string run "<<retime<<" times needs "<<finish-start<<" clock times";
    cout
<<endl;

    start
=clock();
    
string str("a very long literal string");
    
for(size_t ix=0;ix!=retime;++ix)
    
{
        
string str2=str;
        
if(str!=str2)
          ;
    }

    finish
=clock();
    cout
<<"C++ string run "<<retime<<" times needs "<<finish-start<<" clocks";
    cout
<<endl;
    
return ;

}

  上述程序在CentOS下编译并运行测试得数据平均在:
C-style string run 1000000 times needs 240000 clock times
C++ string run 1000000 times needs 110000clocks
在这个数据下明显string的效率要高。
  而在windows下使用vc6.0 release编译并运行,数据平均在:
C-style string run 1000000 times needs 350 clock times
C++ string run 1000000 times needs 350 clocks
  两种类型的效率差不多
  继续在vs2005下release编译,数据平均在:
C-style string run 1000000 times needs 320 clock times
C++ string run 1000000 times needs 370 clocks
  string效率要低一个。
在Linux平台下,string的效率比C-style的要整整高出一倍有多。
而在windows平台下,sting不但效率上的优势没有了,反而比C-style还要差。
不知道这是什么原因。为什么在unix下要比在windows下快如此的多。而在windows上却不行?
快的原因在哪呢?
PS:
不知道我的测试程序这样子写是否可以。

Feedback

# re: C风格字符串与标准库string类型性能对比  回复  更多评论   

2006-05-02 10:14 by 笑笑生
与平 台没有关系的

# re: C风格字符串与标准库string类型性能对比  回复  更多评论   

2006-05-02 11:17 by 史传红
我觉得用string时间快的原因可能跟这句:char *pc2= new char[len+1];
有关。库在处理string时候可能有某种优化,使得处理时间快些。也就是不同的系统在优化 string str2=str; 的时候可能不一样,所以windows系统没有占到优势。

# re: C风格字符串与标准库string类型性能对比  回复  更多评论   

2006-05-02 18:05 by 赵力毅
小生问一下
clock_t是什么数据类型?

# re: C风格字符串与标准库string类型性能对比  回复  更多评论   

2006-05-02 18:29 by Tauruser
@赵力毅
你可以理解为unsigned int类型

# re: C风格字符串与标准库string类型性能对比  回复  更多评论   

2006-05-07 11:11 by cyt
仔细看看Linux的string实现吧。gcc3某个版本以后的stl已经不是完全是SGI的版本了。里面的string使用了reference count的技术。所以,string str2=str;在gcc已经是完全没有内存复制了。
VC的STL一向都是自己写的,记忆中没有使用reference count。如果编译的时候没有打开优化,inline函数是不会实际上实现内嵌的,额外增加的函数调用时间,往往使到程序效率更低。

# re: C风格字符串与标准库string类型性能对比  回复  更多评论   

2006-05-08 09:20 by 小明
vc6自带的stl的string使用了引用计数

vc8就没有使用了

# re: C风格字符串与标准库string类型性能对比  回复  更多评论   

2006-05-08 12:53 by Tauruser
引用计数?
什么来的?

# re: C风格字符串与标准库string类型性能对比  回复  更多评论   

2006-05-18 16:16 by haerbinhk@yahoo.com.cn
在我机器上结果不同
Windows XP 2.8GHZ CPU Visual C++.NET 2003
未打开编译器优化之前
C style string running clock is 2641 cycles
C++ string running clock is 7203 cycles
打开优化,并且使用Release Version
C style string running clock is 1781 cycles
C++ string running clock is 1359 cycles
即使打开编译器优化Release Version仍然比楼主慢很多
这是什么原因?

# re: C风格字符串与标准库string类型性能对比  回复  更多评论   

2006-05-31 22:38 by 含笑半步癫
string str("a very long literal string");
for(size_t ix=0;ix!=retime;++ix)
{
string str2("a very long literal string");
if(str!=str2)
;
}
这样比才比较合适把

# re: C风格字符串与标准库string类型性能对比  回复  更多评论   

2007-04-05 11:35 by polyrandom
ref count的string其实很危险的。多线程情况下如果要确保安全,效率牺牲会很低。
string快还可能有一个原因:有些实现会有一个很小的缓存,如果string短的话,没有内存分配。
本质上我觉得速度应该是一样的,因为C++在这个层面上的包装很薄的。

# re: C风格字符串与标准库string类型性能对比  回复  更多评论   

2007-04-09 01:26 by 踏雪赤兔
服了……一班人在讨论操作系统平台,却不去想一下实现的库!内存分配是SGI版STL的一大特色,SGI STL自己管理一个空闲空间链,当然在这里会比每次使用new去申请空间快得多了,与其在这里乱说,还不如快点找本侯JJ的书看懂它~

# re: C风格字符串与标准库string类型性能对比  回复  更多评论   

2007-04-23 14:27 by 老苏
发现问题是好的,有讨论才有进步,谁能保证第一次提的问题不是愚蠢的?所以,落雪赤兔也不要说得那么绝!不是每个人一接触C++就是高手!再说了,侯捷的书不见得就是权威。
还有,这个问题不只要考虑库的不同,还要考虑硬件平台、软件平台的不同!

# re: C风格字符串与标准库string类型性能对比  回复  更多评论   

2007-05-12 22:09 by artcpp
之前我一直认为string的速度应该比C-Style字串要慢,汗...

# re: C风格字符串与标准库string类型性能对比  回复  更多评论   

2007-05-12 22:14 by artcpp
刚才验证了一下,证实了我的想法:
Debug:
C-style string run 1000000 times needs 1021 clock times
C++ string run 1000000 times needs 8773 clocks
Release:
C-style string run 1000000 times needs 270 clock times
C++ string run 1000000 times needs 410 clocks

# re: C风格字符串与标准库string类型性能对比  回复  更多评论   

2007-05-12 22:15 by artcpp
忘了说:VC2003SP1。

# re: C风格字符串与标准库string类型性能对比  回复  更多评论   

2007-05-13 13:08 by artcpp
发现:当字符串比较长时和特别短时,string的性能要占优。不长也不短时,C-Style性能要占优。

# re: C风格字符串与标准库string类型性能对比[未登录]  回复  更多评论   

2007-12-24 12:45 by Koson
re.学习了.

# re: C风格字符串与标准库string类型性能对比  回复  更多评论   

2008-12-28 10:53 by no
想提高VS2003以后版本的STL速度,可以定义
#define _SECURE_SCL 0
去掉内存安全检查部分.

# re: C风格字符串与标准库string类型性能对比  回复  更多评论   

2009-05-13 10:24 by 穿墙
我用 vs 2003 编译,
debug string 比 c风格字符串慢很多
release string 比 c风格字符串稍快

# re: C风格字符串与标准库string类型性能对比  回复  更多评论   

2010-03-31 02:12 by Hzj_jie
这样比较没有意义,因为差别只在于stl::Alloc
对于c-string,你每次自己分配内存
对于std::string,会使用分配器分配内存
template<typename _CharT, typename _Traits, typename _Alloc>
class basic_string

很多东西可以说,stl是一个杰作,而string的作用也不是简单的复制而已。比如operator+之类的操作就是非常有效的。

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理