读书笔记--More Effective C++--效率(总结)

时间:2022-05-04 21:54:51

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&plus;&plus;》第4章 设计与声明(2)-读书笔记

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

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

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

  5. 《Effective C&plus;&plus;》第2章 构造&sol;析构&sol;赋值运算(2)-读书笔记

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

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

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

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

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

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

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

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

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

随机推荐

  1. 表达式括号匹配(stack)

    题目描述 假设一个表达式由英文字母(小写).运算符(+.-.*./)和左右小(圆)括号构成,以“@”作为表达式的结束符.请编写一个程序检查表达式中的左右括号是否匹配,若匹配,则返回“YES”:否则返回 ...

  2. Apache-Jemeter web性能测试工具使用

    Jmeter是一款java开源的性能测试软件. 要使用该工具进行性能测试,首先需要下载该工具到你的电脑,接着配置java开发环境以及Jmeter环境.搭建完成之后,OK,我们就可以进行测试了. 测试第 ...

  3. ThinkPHP中URL解析原理,以及URL路由使用教程!

    几个概念: THINKPHP 是一个MVC框架,使用PATHINFO解析出分组名,模块名,方法名,以及参数. PATHINFO:就是 http://localhost/index.php/Home/I ...

  4. android面试题之四

    十六.Android中Dalvik和JVM的区别是什么? 1. Dalvik基于寄存器,而JVM基于栈.基于寄存器的虚拟机对于更大的程序来说,在它们编译的时候,花费的时间更短. 2. Dalvik负责 ...

  5. html中opacity的使用

    今天做项目要用到一个层背景透明,层上的内容不透明的效果 结果网上找了半天,没一个靠谱的, 最后倒是被一句话点醒了:纸烧了,纸上面的字也会没了 所以,要设2层遮罩层,看代码: .dialog_1//内容 ...

  6. android Xml生成一条细线,以及获取屏幕宽度和高度

    <View android:layout_width="match_parent" android:layout_height="2dip" androi ...

  7. JS函数实现金额小写转大写

    ///<summery>小写金额转化大写金额</summery> function AmountLtoU(amount) { if (isNaN(amount) || amou ...

  8. APICloud使用

    APICloud-APP开发平台 [网址:]http://www.apicloud.com/ APICloud studio 下载 打开网址,找到开发者社区->文档->下载->开发工 ...

  9. Lua教程

    Lua中的类型与值 Lua中的表达式 Lua中的语句 Lua中的函数 Lua中的闭包 Lua 中 pairs 和 ipairs 的区别 Lua中的迭代器与泛型for Lua中的协同程序 Lua中__i ...

  10. Golang处理数据库的nil数据

    在用golang获取数据库的数据的时候,难免会遇到可控field.这个时候拿到的数据如果直接用string, time.Time这样的类型来解析的话会遇到panic. 那么如何处理这个问题呢,第一个出 ...