《C++高级编程》之--编写高效的C++程序

第五部分 编写高效的C++程序

本文基址:http://blog.csdn.net/cugxueyu/archive/2007/12/07/1923564.aspx

一、性能和效率概述

    编写高效的程序,需要在设计层次上做考虑,并在实现层次上考虑细节。(一定要在程序的生命周期已开始就考虑性能)

  “编写高效的 C++ 程序”指要编写能高效运行的程序,而不是高效地编写程序,要学会如何节省用户的时间,而不是节省你自己的时间。
1、实现高效的两种方法
 如果想编写真正高性能的应用,就必须从设计一开始就考虑效率问题。 设计级效率包括:选择 高效算法,避免 不必要的步骤和计算,而且要 选择适当的设计优化
 
2、C++是一种低效语言吗
 C++包括一些高级构造,如异常和虚方法,这些构造都相当的慢。
 C++语言有一个一般性的设计原则: 如果不用它,就不必为之付出。(如果不使用虚方法,就不用付出使用虚方法的性能代价。)
 
二、语言级效率
 好的优化编译器可以自动完成某些语言级优化,请检查编译器文档,了解有关细节。
1、高效的处理对象
①、传引用
  对象应该很少按值传递给函数或方法。
 总体来说,如果一个函数要修改一个对象,可以简单的按引用传递对象;如果函数不会修改对象,则应按const引用来传递。
 
②、按引用返回
   应当按引用从函数返回对象,以避免不必要的复制。(不能返回一个局部对象的引用和指针)。
 
③、按引用捕获异常
   应当按引用捕获异常,避免额外的复制。[异常在性能方面是重量级的,因此在异常方面做小幅改进也会大大改善效率。]
 
④、避免创建临时对象
 很多情况下,编译器会创建临时的匿名对象。
 
⑤、返回值优化
  按值返回对象的函数可能导致创建一个临时对象。[一般编译器会把大多数情况下的临时变量予以优化,这种优化称为 返回值优化]
 
2、不要过度使用高开销的语言特性
  从执行 速度方面看,许多C++特性的开销都很大, 异常、虚函数、 RTTI(运行时类型识别)更是首当其冲。即使在程序中没有显式地使用异常和RTTI特性,这个特性也会带来性能开销,仅仅是因为可能会用到这些特性,为了对此提供支持,都会在执行中增加额外的步骤。
   [编译器可以指定允许指定编译程序的方式,即: 编译程序时根本不支持这些特性。]
   如:Linux g++ 3.2.2
       如果g++指定标志来 禁用异常:g++ -fon-exceptions test.cpp
       如果g++制定标志 禁用 RTTI:g++ -fon-rtti test.cpp [编译器会成功编译,但是无法运行]。
3、使用内联方法和函数
      程序员的 内联请求只是对编译器提出一个建议,即使你想内联某个函数,编译器也可以拒绝内联该函数。
      另一方面,一些编译器会在完成优化的步骤中,对适当的函数和方法进行内联,即使这些函数没有标记inline关键字。[ 编译器文档查询]
 
三、设计级效率
  程序中的设计选择对性能的影响远远超过了语言级选择的影响。[选择合适的算法]
 优化程序的三个设计技术: 缓存 对象池线程池
 
 1、尽可能缓存
    缓存(Caching)是指存储有关内容以便将来使用,从而避免获取或再次计算。
    下面任务会很慢:
·      磁盘存取:如果会经常存取一个文件,应该把文件内容保存在RAM中。
·      网络通信
·      数学计算
·      对象分配[ 对象池]
·      线程创建[ 线程池]
 
2、使用对象池
  对象池技术可以避免在程序的生命周期中创建和删除大量对象,如果知道程序需要同一类型的大量对象,而且对象的生命周期都很短,就可以为这些对象创建一个 池( pool 进行缓存。只要代码中需要一个对象,就可以向对象池申请,用完此对象后,要把它放回池中。对象池只创建一次对象,因此他们的构造函数只调用一次,而不是每次使用时都调用。
 
3、线程池
 线程支持是 特定于平台的。
 
四、测评分析[ gprofoprofile]
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值