分享
 
 
 

STL性能测试

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

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

C++ Standard Template Library——STL的性能究竟如何,不同版本的STL其性能差异有多少?为了解这些,让我们来做一个简单的测试吧。

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

因本人水C/C++水平极为有限,写的code实在拿不出手,为保证公平,最好用一位大家公认的大师级人物写的code来做这个测试。好在《The Practice of Programming》(中译本《程序设计实践》,裘宗燕译)第三章里,作者

Brian W. Kenighan分别用C和C++写了实现相同功能的Code,他老人家的程序用在这里最合适不过了。这个程序是用来实现“马尔可夫(markov)链算法”的,关于markov链算法的详情请看本文附录1。

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

测试用机:

机器一:PII 300 with 512k L2 Cache,Intel 440LX主板 66MHz外频,64M RAM,安装P – Win98 SE;

机器二:PII 350 with 512k L2 Cache,Intel 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;使用list的markov_l.cpp;使用deque的markov_d.cpp。其中markov.c需要和eprintf.c一同编译链接。

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

ps.我把BCC安装在C:\bcc,Cygwin安装在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个程序,就得到9个exe文件,分别是:

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,文件大小265635Bytes,46751个词,存为text1.txt。

测试办法:在命令行敲入

g_c <text1.txt >g1.txt

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

为了方便,我写了一个小程序自动进行测试:一个exe文件执行30次,生成30个txt文件。前三个不计,找出后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带的STL,list尚可,但至少deque有问题,很耗内存,结果磁盘交换花去大量时间,可惜我没有256M内存的机器做测试。

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

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

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

在www.sgi.com下载了SGI STL 3.3,在下载时顺便看了看FAQ,得知SGI STL3.3与Visual 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.cpp与markov_d.cpp中的#include<iostream>改为#include<iostream.h>

用cl /G6 /O2 /Og /GX /MT /Fev_d_sgi.exe markov_d.cpp 编译成功,这样又得到两个EXE文件:v_l_sgi.exe与v_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 STL与VC6配合默契,有兴趣的朋友可以进一步测试。

但事情在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组件效率很差,慎用。”,这里可以补充一点是VC6的deque效率也很差,慎用。

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

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

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有