电信主站 网通分站
购买流程 付款方式 常见问题 在线提问 续租服务 购物车
用户名: 密 码: 忘记密码?
首 页
域名注册
虚拟主机
双线主机
服务器租用
VPS主机
企业邮局
代理专区
客服中心
虚拟主机行业资讯 虚拟主机评测对比 互联网最新动态 技术学院 站长资讯 在线教程 网站运营
搜索优化 服务器 网络编程 图形图象 站长之家 网页制作 操作系统
冲浪宝典 软件教学 视频通信 办公软件 邮件系统 网络安全 认证考试
您当前位置:西部数码->资讯中心-> 在线教程-> .NET
STL性能测试-.NET教程,评论及其它
作者:网友供稿 点击:172
  西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!虚拟主机可在线rar解压,自动数据恢复设置虚拟目录等.虚拟主机免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金!
文章页数:[1] 

c++ standard template library——stl的性能究竟如何,不同版本的stl其性能差异有多少?为了解这些,让我们来做一个简单的测试吧。

测试的基本思路是用cc++分别实现一个程序,实现相同的功能,并要求c++程序的主要数据结构用stl中的containersalgorithms等来实现。然后比较两个程序的性能,看看究竟谁快,快多少。

因本人水c/c++水平极为有限,写的code实在拿不出手,为保证公平,最好用一位大家公认的大师级人物写的code来做这个测试。好在《the practice of programming》(中译本《程序设计实践》,裘宗燕译)第三章里,作者brian w. kenighan分别用cc++写了实现相同功能的code,他老人家的程序用在这里最合适不过了。这个程序是用来实现“马尔可夫(markov)链算法”的,关于markov链算法的详情请看本文附录1

我在《the practice of programming》一书的主页 http://tpop.awl.com 下载到相应的代码,为了记录程序运行的时间,我在代码中加了几条语句(以“/* added by chen shuo*/”标明),完整的代码见本文附录2

测试用机:

机器一:pii 300 with 512k l2 cacheintel 440lx主板 66mhz外频,64m ram,安装p – win98 se
机器二:pii 350 with 512k l2 cacheintel 440bx主板 100mhz外频,128m ram,安装windows2000 professional中文版with service pack 2

编译环境:(均在windows下编译)

1、  microsoft visual c++ 6.0 with service pack 5

2、  cygwin : dll ver 1.3.2 gnu c++ 2.95.3 (下载自http://www.cygwin.com

3、  borland c++ compiler 5.5.1 for free (下载自http://www.borland.com

 

共有三个文件要编译,分别是c版的markov.c;使用listmarkov_l.cpp;使用dequemarkov_d.cpp。其中markov.c需要和eprintf.c一同编译链接。

编译命令行参数(均已打开速度优化选项,编译的可执行文件在dos prompt中执行):

ps.我把bcc安装在c:\bcccygwin安装在c:\cygwin。所以环境变量的设置办法是:

set msdevdir=c:\progra~1\micros~3\common\msdev98

set msvcdir=c:\progra~1\micros~3\vc98

set path="c:\progra~1\micros~3\vc98\bin";c:\windows;c:\windows\command;c:\bcc\bin;

set path=%path%;c:\cygwin\bin "c:\progra~1\micros~3\common\msdev98\bin";

set include=c:\progra~1\micros~3\vc98\include;

set lib=c:\progra~1\micros~3\vc98\lib;

1、以编译markov_l.cpp为例,为区别不同编译器生成的exe文件,需指定生成的exe文件的名子,蓝色部分是生成的文件名。

g++ -o g_l.exe -o4 markov_l.cpp

bcc32 -ic:\bcc\include -lc:\bcc\lib -o2 -6 –eb_l.exe markov_l.cpp

cl /g6 /o2 /og /gx /mt /fev_l.exe markov_l.cpp

2、再以编译markov.c为例

g++ -o g_c.exe -o4 markov_l.c eprintf.c

bcc32 -ic:\bcc\include -lc:\bcc\lib -o2 -6 –eb_c.exe markov_l.c eprintf.c

cl /g6 /o2 /og /mt /gx /fev_c.exe markov.c eprintf.c

这样我们用三个编译器编译3个程序,就得到9exe文件,分别是:

 

 

markov.c

markov_l.cpp

markov_d.cpp

gnu c++ 2.95.3

g_c.exe

g_l.exe

g_d.exe

bcc 5.5.1

b_c.exe

b_l.exe

b_d.exe

vc6

v_c.exe

v_l.exe

v_d.exe

 

为了验证各个程序的正确性,我用bcc 5.5带的license.txt(15095bytes, 2239个词)作了简单的测试(c:\bcc> b_d < license.txt ),各程序均能迅速给出结果。还需要一个较大规模的文本来作性能测试,我用的是英文版《简·爱(jean eyre)part ii, chapter 10 ~ chapter 18,文件大小265635bytes46751个词,存为text1.txt

测试办法:在命令行敲入

g_c <text1.txt >g1.txt

执行完后,打开g1.txt,最后一行”the time was:”是程序执行的时间,同时看看有没有生成10000个单词,若不足10000个,需要再次执行测试,这样才能保证测试的公平。

为了方便,我写了一个小程序自动进行测试:一个exe文件执行30次,生成30txt文件。前三个不计,找出后27个文件中行数达到10000的,求出它们的平均执行时间。

在两台机器上做的测试结果如下,单位是秒:

 

pii 300 with 64m ram

pii 350 with 128m ram

b_c

0.432

0.330

b_d

>300*

5.567

b_l

>300*

5.607

g_c

0.463

0.336

g_d

3.366

2.581

g_l

2.142

1.707

v_c

0.568

0.459

v_d

>300*

131.6*

v_l

2.714

2.080

注:凡标有*者,在程序执行时硬盘狂响,估计磁盘i/o占去不少时间。

 

初步分析以上数据可以得出:

1、  borland c++ 5.5.1带的stl的性能比较低,而且似乎比较耗内存,在内存较小的机器上执行时,磁盘交换将花去大量时间。

2、  visual c++ 6.0带的stllist尚可,但至少deque有问题,很耗内存,结果磁盘交换花去大量时间,可惜我没有256m内存的机器做测试。

3、  gnu c++ 2.95.3带的stl性能较好,在内存较小的机器上执行也没有问题。

4、  精心设计的c程序比实现相同功能且使用stlc++执行要快。在本次测试中,c++程序的功能主要由stl container实现,stl的性能影响了整个程序性能的90%以上,所以显出这么大的差距。

 

下面来搞点移花接木,把gnu c++带的stl给其他两个编译器用看看有什么效果。

www.sgi.com下载了sgi stl 3.3,在下载时顺便看了看faq,得知sgi stl3.3visual c++5.0以上搭配时,需要用iostream.h取代iostream;还有是支持sgi stl的编译器里好像没有borland c++

 把下载来的stl.zip释放到c:\program files\microsoft visual studio\vc98\include\sgistl。并把环境变量重新设置:

set include=c:\progra~1\micros~3\vc98\include\sgistl;c:\progra~1\micros~3\vc98\include

然后把markov_l.cppmarkov_d.cpp中的#include<iostream>改为#include<iostream.h>

cl /g6 /o2 /og /gx /mt /fev_d_sgi.exe markov_d.cpp 编译成功,这样又得到两个exe文件:v_l_sgi.exev_d_sgi.exe,前者是markov_l.cpp编译生成的。下面是这两个exe的平均执行时间:

 

pii 300 with 64m ram

pii 350 with 128m ram

v_l_sgi

1.375

1.074

v_d_sgi

1.943

1.597

哇!比gnu c++本身还要快!当然这个简单的测试并不能证明sgi stlvc6配合默契,有兴趣的朋友可以进一步测试。

但事情在borland c++ 5.5.1上就没这么顺利了,我试了好多方法,但程序不能用sgi stl。有兴趣的朋友可以去www.stlport.org下载stlport 4.5来和borland c++ 5.5.1配合使用,看看性能如何。

myan介绍:“borland使用的是rogue wave stl其效率最差;visual c++中的stl是著名大师p. j. plauger的个人作品,性能较好,但其queue组件效率很差,慎用。”,这里可以补充一点是vc6deque效率也很差,慎用。

 附记:我是北京师范大学的本科生,写这篇文章时(2001年10月2日)刚上大二,这是我作为一个c++初学者,在学习的过程中的一些心得体会,写在这里供和我一样的初学者参考。

我的信箱chenshuo@chenshuo.com个人主页:http://www.chenshuo.com,欢迎访问

作者主页http://www.chenshuo.com可下载测试文本与源代码


文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
相关主题
文章页数:[1] 
Google
热门文章
·经典收藏之 - C++内存管理详解-.NET教程,C#语言
·Master Page 初探-.NET教程,评论及其它
·GDI+编程10个基本技巧-.NET教程,评论及其它
·VB.NET中让Textbox只能输入数字(二)-.NET教程,VB.Net语言
·stl应用小问题-.NET教程,评论及其它
·WIN32中颜色值(COLORREF)与.NET中颜色值(Color)的转换-ASP教程,系统相关
·打造自己的专业图像工具-Visual C++ 2005图像编程系列【三】-.NET教程,C#语言
·.Net中常见问题及解决方法归类-.NET教程,.NET Framework
·Lex和Yacc从入门到精通(3)--一个极其简单的lex和yacc程序-.NET教程,评论及其它
·VB下几个非常有用的函数-.NET教程,VB.Net语言

最新文章
·VC#初学入门:第一个Windows程序
·ASP.NET 2.0-选用DataSet或DataReader
·用.net 处理xmlHttp发送异步请求
·asp.net创建文件夹的IO类的问题
·asp.net 2.0 中加密web.config 文件中的配置节
·关于ASP.NET调用JavaScript的实现
·如何实现ASP.NET网站个性化
·Acegi安全系统的配置-.NET教程,评论及其它
·Spring安全系统:Acegi Security Acegi简介-.NET教程,评论及其它
·Biztalk 开发之 架构和实例的验证-.NET教程,评论及其它


 
 


版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!

特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
  打印  刷新  关闭
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 虚拟主机 | 资讯中心 | 友情链接 | 网站地图

版权所有 西部数码(www.west263.com)
CopyRight (c) 2002~2006 west263.com all right reserved.
公司地址:四川成都市万和路90号天象大厦4楼 邮编:610031
电话总机:028-86262244 86263048 86263408 86263960 86264018 86267838
售前咨询:总机转201 202 203 204 206 208
售后服务:总机转211 212 213 214
财务咨询:总机转224 223 传真:028-86264041 财务QQ:点击发送消息给对方635483282
售前咨询QQ:点击发送消息给对方2182518 点击发送消息给对方241975952 点击发送消息给对方275026793 点击发送消息给对方408235859
售后服务QQ:点击发送消息给对方17708515 点击发送消息给对方307742704 点击发送消息给对方287976517 点击发送消息给对方363783715
《中华人民共和国增值电信业务经营许可证》编号:川B2-20030065号