PS: 本文只是总结,具体内容需要去查看More Effective C++--效率部分。

1. 80—20准则

  大约 20%的代码使用了 80%的程序资源;大约 20%的代码耗用了大约 80%的运行时间;大约 20%的代码使用了 80%的内存;大约 20%的代码执行 80%的磁盘访问;80%的维护投入于大约 20%的代码上;通过无数台机器、操作系统和应用程序上的实验这条准则已经被再三地验证过。

  进行优化、寻找瓶颈时,可以用 profiler 程序识别出令人讨厌的程序的 20%部分。不是所有的工作都让 profiler 去做。你想让它去直接地测量你感兴趣的资源。

2.懒惰计算法(lazy evaluation)

  从效率的观点来看,最佳的计算就是根本不计算。

  推迟计算工作直到系统需要这些计算的结果。如果不需要结果,将不用进行计算。

3.分期摊还期望的计算

  让程序做的事情比被要求的还要多,通过这种方式来提高软件的性能。这个条款的核心就是over-eager evaluation(过度热情计算法):在要求你做某些事情以前就完成它们。

  当你必须支持某些操作而不总需要其结果时,lazy evaluation 是在这种时候使用的用以提高程序效率的技术。当你必须支持某些操作而其结果几乎总是被需要或被不止一次地需要时,over-eager 是在这种时候使用的用以提高程序效率的一种技术。它们所产生的巨

大的性能提高证明在这方面花些精力是值得的。

4. 理解临时对象的来源

  在 C++中真正的临时对象是看不见的,它们不出现在你的源代码中。建立一个没有命名的非堆(non-heap)对象会产生临时对象。这种未命名的对象通常在两种条件下产生:为了使函数成功调用而进行隐式类型转换函数返回对象时。

  理解如何和为什么建立这些临时对象是很重要的,因为构造和释放它们的开销对于程序的性能来说有着不可忽视的影响。

5.协助完成返回值优化

  返回值优化是编译器自动进行的特殊优化,其通过使用函数的 return 位置(或者在函数被调用位置用一个对象来替代)来消除局部临时对象。

  而这种优化是有触发机制的:返回 constructor argument 而不是直接返回对象,如下

//优化前
const Rational operator*(const Rational& lhs,
const Rational& rhs)
{
Rational Result(lhs.numerator() * rhs.numerator(),
lhs.denominator() * rhs.denominator());
return Result;//返回对象,不触发返回值优化
} //优化后
const Rational operator*(const Rational& lhs,
const Rational& rhs)
{
return Rational(lhs.numerator() * rhs.numerator(),
lhs.denominator() * rhs.denominator()); //返回构造式,触发返回值优化
 }

6.通过重载避免隐式类型转换

  编译器有时候会为了使函数成功调用而进行隐式类型转换,例如函数A需要一个int类型的参数,而调用时,却输入了一个float类型的参数。此时,编译器会将float转换为int,从而产生了临时对象。

  可以用重载来避免这种情况,如在上述例子中,重载函数A,使它可以接受一个float类型的参数。

  注意:由于80-20法则,当函数A需要频繁调用,是“20%的代码使用了 80%的程序资源”的“20%”中的一员时,使用这种优化才有意义。如果函数A只需调用1,2次,用这种优化效果不大,反而会增加了代码量。

7.考虑用运算符的赋值形式(op=)取代其单独形式(op)

  赋值形式:A+=B

  单独形式:A=A+B

  赋值形式比单独形式效率更高,因为单独形式要返回一个新对象,从而在临时对象的构造和释放上有一些开销;赋值形式把结果写到了左边的参数里,因此没有临时对象产生。(返回值优化)

8.考虑变更程序库

  因为不同的程序库在效率、可扩展性、移植性、类型安全和其他一些领域上蕴含着不同的设计理念,通过变换使用给予性能更多考虑的程序库,你有时可以大幅度地提高软件的效率。

9.理解虚拟函数、多继承、虚基类和RTTI所需的代价

  理解虚函数、多继承、虚基类、RTTI 所需的代价是重要的,但是如果你需要这些功能,不管采取什么样的方法你都得为此付出代价,理解这点也同样重要。

读书笔记--More Effective C++--效率(总结)的更多相关文章

  1. 读书笔记--《Effective C#》总结

    值得推荐的一本书,适合初中级C#开发人员 第1章 C#语言元素 原则1:尽可能的使用属性(property),而不是数据成员(field) ● 属性(property)一直是C#语言中比较有特点的存在 ...

  2. 《Effective C++》第5章 实现-读书笔记

    章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...

  3. 《Effective C++》第4章 设计与声明(2)-读书笔记

    章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...

  4. 《Effective C++》第4章 设计与声明(1)-读书笔记

    章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...

  5. 《Effective C++》第2章 构造/析构/赋值运算(2)-读书笔记

    章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...

  6. 《Effective C++》第1章 让自己习惯C++-读书笔记

    章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...

  7. 人生效率手册:如何卓有成效地过好每一天--By张萌姐姐--读书笔记

    读书笔记:<人生效率手册>:如何卓有成效地过好每一天--By张萌姐姐... 整本书看完的感受: 这本书主要讲的是生活中我们需要给自己一个目标,然后通过自己的努力去实现这个目标,书中说的很多 ...

  8. 《Effective C++》第3章 资源管理(2)-读书笔记

    章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...

  9. 《Effective C++》第3章 资源管理(1)-读书笔记

    章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...

随机推荐

  1. 小程序swiper效果高宽设置(微信小程序交流群:604788754)

    swiper的宽和高一定要设置在swiper上面.swiper-item默认继承swiper的宽和高.swiper-item容器里面的宽和高没有继承他的父节点宽和高,需要从新设置. 不明白之处,可以咨 ...

  2. windows bat发布成服务

    删除服务 删除名为"WINDOWS MANAGEMONT INSTALLER"的系统服务 sc delete "windows managemont Installer& ...

  3. 如何用iptables实现NAT(转)

    http://www.cnblogs.com/little-ant/p/3548087.html

  4. daay04流程控制之for循环

    for循环主要用于循环取值 student=['egon','虎老师','lxxdsb','alexdsb','wupeiqisb'] # i=0 # while i < len(student ...

  5. unity中自制模拟第一人称视角

    public float sensitivityX = 5f; public float sensitivityY = 5f; public float sensitivetyKeyBoard = 0 ...

  6. day27-python阶段性复习-基础

    一.基础资料,安装python Python 跨平台的,(Linux,Windows,mac) 网站www.python.org 解释器交互方式 Ipython Python shell https: ...

  7. Android : iperf-2.0.4 网络测试工具

    一.源码下载及交叉编译: 下载:https://pan.baidu.com/s/1i6NYDF3   //包含linux和windows上的可执行文件 1. 解压后获得perf-2.0.4源码.2. ...

  8. Docker小白从零入门到实战系列【二】

    1.安装好Centos 7 2.关闭SELINUX sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/configsetenfo ...

  9. python三目运算符

    python 可通过 if 语句来实现三目运算符的功能,因此可以近似地把这种if语句当成三目运算符.作为三目运算符的 if 语句的语法格式如下: True_statements if expressi ...

  10. delete和delete[] 区别

    // DeleteAndDelete[].cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <Windows.h> ...