Tauruser
Enjoy Every Day
posts - 34, comments - 95, trackbacks - 0, articles - 5
C++博客
::
首页
::
新随笔
::
联系
::
聚合
::
管理
C风格字符串与标准库string类型性能对比
Posted on 2006-05-01 23:58
Tauruser
阅读(6302)
评论(20)
编辑
收藏
引用
所属分类:
算法与数据结构
今天在看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
0
;
}
上述程序在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+之类的操作就是非常有效的。
刷新评论列表
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
双链表模版类的实现
C风格字符串与标准库string类型性能对比
算法与数据结构实验(二)
为什么在VS2005重载输出运算符那么难?
我的算法与数据结构学习(三)
Josephus问题
算法与数据结构实验(一)
我的算法与数据结构学习(二)
我的算法与数据结构学习(一)
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
Powered by:
C++博客
Copyright © Tauruser
日历
<
2006年5月
>
日
一
二
三
四
五
六
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
公告
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(7)
给我留言
查看公开留言
查看私人留言
随笔分类
(16)
MFC(2)
计算机图形学(2)
密码学
数学模型
数值计算(2)
算法与数据结构(9)
信息论(1)
随笔档案
(34)
2007年3月 (1)
2007年2月 (2)
2007年1月 (1)
2006年10月 (1)
2006年6月 (3)
2006年5月 (5)
2006年4月 (6)
2006年3月 (14)
2006年2月 (1)
文章分类
(5)
密码学
数学模型
数值计算
算法与数据结构(4)
网络(1)
信息论
文章档案
(5)
2006年4月 (1)
2006年3月 (4)
相册
文章贴图
收藏夹
(3)
我的收藏(3)
协议
流媒体
中国协议网
友情链接
Orlaa
最新随笔
1. CListCtrl For Beginners(转载)
2. 结构体对齐的具体含义(#pragma pack) (转载)
3. MFC ComboBox 使用方法(转载)
4. 05年写的直线裁剪算法
5. C# Coding时的注释格式(zz)
6. 查找字符串的哈希方法(zz)
7. 木马客户端与服务端通讯如何隐藏不被发现
8. Gauss消去法直接求解方程组(附例程)
9. 使用AsycnSocket类进行简单双机通讯
10. Romberg求积(例程)
搜索
积分与排名
积分 - 104874
排名 - 237
最新评论
1. re: 双链表模版类的实现
问下:关于查找(search)那部分,我有点小问题要问,就是你直接就靠默认的比较操作符来比较,而你所用的是模版,链表支持各种类型,那么是字符串类型的链表或自定义类型的呢,你该怎么办
--周晓荣
2. re: OnSize()加入处理函数后,DEBUG报告出错
评论内容较长,点击标题查看
--NULL
3. re: C风格字符串与标准库string类型性能对比
评论内容较长,点击标题查看
--Hzj_jie
4. re: 05年写的直线裁剪算法
你这个算法也太复杂了吧
--啊啊啊啊啊啊
5. re: C++ Primer Fourth Edition (download file)
i want english edition
--zhccc
阅读排行榜
1. MFC ComboBox 使用方法(转载)(18704)
2. 结构体对齐的具体含义(#pragma pack) (转载)(11379)
3. Tab Control控件使用的例子(zz)(8343)
4. VC++2005 比 VC++ 6.0 退步了?(7511)
5. MAC地址有合法不合法之分吗?(7438)
评论排行榜
1. C风格字符串与标准库string类型性能对比(20)
2. VC++2005 比 VC++ 6.0 退步了?(12)
3. OnSize()加入处理函数后,DEBUG报告出错(8)
4. 为什么在VS2005重载输出运算符那么难?(7)
5. Gauss消去法直接求解方程组(附例程)(7)