`
ihuashao
  • 浏览: 4856638 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

STL性能测试

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

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

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

共有三个文件要编译,分别是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可下载测试文本与源代码

分享到:
评论

相关推荐

    常用STL模型文件

    3. **错误检测**:检查STL文件中的拓扑错误,如自交三角面片、反向法线等,并提供修复工具。 4. **渲染优化**:为了提高显示性能,可能需要进行背面剔除、LOD(Level of Detail)层次细节、光照预计算等优化。 5. **...

    STL扩展技术手册(Extended STL)光盘

    光盘中的工具文件可能是用于辅助STL开发或调试的工具,比如性能测试工具,用于比较不同实现的STL容器或算法的效率;或者是代码分析工具,帮助检查STL代码的正确性和兼容性。这些工具对于提升开发效率和代码质量至关...

    StlTest STL代码 Code StlTest STL代码 Code

    STL(Standard Template Library,标准模板库)是C++...测试代码通常会包含单元测试,验证STL组件的功能是否正确,性能是否高效。通过分析这些代码,我们可以学习如何在实际项目中有效利用STL,提升代码质量与效率。

    stl介绍及使用方法

    在实际编程中,使用STL可以显著提高代码质量,减少错误,因为STL的组件经过精心设计,已进行了大量的优化和测试。此外,STL的文档资源丰富,如FTP站点ftp://butler.hpl.hp.com/stl/、David Mussers的STL主页...

    支持EVC的STL库

    EVC的STL库是针对嵌入式环境优化的,旨在提供与桌面版STL相似的功能,但可能在内存管理和性能上有所不同,以适应嵌入式系统的资源限制。 STL的核心组件包括: 1. 容器:如vector(动态数组)、list(双向链表)、...

    ACM STL的应用

    7. 在线评测系统的应用:ACM/ICPC竞赛中,选手们需要在有限的时间内提交代码并通过在线评测系统(如ZOJ)进行测试。熟悉在线评测系统的使用和其对提交代码的限制,是ACM竞赛中十分关键的一个环节。 8. 实际编程技巧...

    30分钟掌握stl

    2. **非面向对象的组件**:在STL中,没有明显的类继承关系,而是通过模板参数化来实现功能,这样不仅简化了设计,也提高了性能。 3. **内联函数的应用**:STL大量使用内联函数来减少函数调用的开销,从而提高运行...

    c.STL 学习c语言的必看

    此外,由于STL已经过广泛测试,使用它可以减少出现错误的可能性,从而降低了调试和维护的成本。 #### 3. 性能优化 STL内部使用了许多高效的算法和技术,比如`std::sort`背后的快速排序算法,这些都是经过优化的,...

    C++《STL》讲义.pdf

    STL的广泛使用使得开发人员可以快速上手编写复杂的程序,因为它提供了一套经过充分测试且高效的工具集。 在C++编程中,了解和掌握STL是提高开发效率和代码质量的关键。STL的学习不仅限于容器、迭代器和算法的使用,...

    X-CUBE-STL-H7 safety manual 安全手册

    5. 自我测试库:X-CUBE-STL-H7 软件扩展包提供了一系列自我测试库,旨在检测微控制器的故障和错误。这些库可以帮助用户快速检测和诊断系统的故障,以确保系统的可靠性和安全性。 6. 故障检测:X-CUBE-STL-H7 软件...

    重新上传的Effective.STL中文.CHM

    7. STL与STL之外的库和工具的集成:如何将STL与其他库(如Boost库)结合,以及如何利用STL进行单元测试等。 8. 避免常见的STL陷阱:Meyers还揭示了一些可能导致意外行为或性能下降的常见错误,帮助你避免踩坑。 ...

    STL文件的分割与拼接处理软件开发

    5. 性能优化:在处理复杂模型时,分割与拼接算法需要高效的执行,这就要求开发过程中不断进行性能优化。例如,可能需要减少算法的复杂度、提高数据处理效率、优化内存使用等。 6. 兼容性和稳定性:软件需要能够处理...

    CuraEngine-master_STL_开源_切片_stl切片源代码_

    这对于定制化需求、性能优化以及创新功能的开发非常有帮助。例如,你可能想要自定义支撑结构的生成方式,或者调整层厚和填充密度,这些都可以通过深入研究源代码实现。 切片过程是3D打印的关键步骤,CuraEngine中的...

    STL文件的读取(普通文件解析与内存映射文件解析) cpp&stl

    在提供的压缩包中,有两个STL文件(demo_sphere.stl 和 demo_sphere1.stl),可以分别用这两种方法读取并进行性能测试,以实际验证哪种方法更优。MMF.cpp文件可能是用于实现内存映射文件解析STL的代码。通过运行这个...

    实现STL文件的读取保存

    最终的运行结果将告诉我们程序读取和处理STL文件的效率以及去重后节点的数量,这对于优化数据处理流程及评估算法性能是十分重要的。 在掌握了C++中如何使用文件流`ifstream`、数据结构`map`和`vector`以及类的定义...

    STL.rar_C++ STL_STL_STL多个网络_stl优点举列_visual c

    STL的主要目标是提高代码的可读性、可维护性和性能,通过使用泛型编程和模板实现。在C++ STL中,主要包含以下四大组件:容器、迭代器、算法和函数对象。 容器是STL的核心部分,它们提供了数据存储的抽象。例如,`...

    mfc STL格式形体的读取与显示

    7. 示例代码:压缩包中的"ckd12.stl"是一个具体的STL文件实例,可以作为读取和显示的测试对象。通过编写和运行代码,可以实际演示如何加载并显示这个STL模型。 8. 效率优化:对于大型STL文件,可能需要考虑内存管理...

    STL port

    STLport是一个独立实现的STL,旨在提供跨平台的兼容性和高性能。在本篇文章中,我们将深入探讨STLport 4.5.3版本的配置方法以及与C++ STL相关的知识点。 首先,STLport的配置过程可能因操作系统和编译器的不同而...

    STL源码剖析 中文版

    - **实践应用**:通过编写测试代码验证STL的行为和性能。 - **性能优化**:根据源码实现,探索可能的优化路径。 #### 五、核心知识点详解 - **vector**:实现为一个动态数组,内部使用连续内存块存储元素。主要关注...

Global site tag (gtag.js) - Google Analytics