读书笔记--More Effective C++--效率(总结)
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++--效率(总结)的更多相关文章
- 读书笔记--《Effective C#》总结
值得推荐的一本书,适合初中级C#开发人员 第1章 C#语言元素 原则1:尽可能的使用属性(property),而不是数据成员(field) ● 属性(property)一直是C#语言中比较有特点的存在 ...
- 《Effective C++》第5章 实现-读书笔记
章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...
- 《Effective C++》第4章 设计与声明(2)-读书笔记
章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...
- 《Effective C++》第4章 设计与声明(1)-读书笔记
章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...
- 《Effective C++》第2章 构造/析构/赋值运算(2)-读书笔记
章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...
- 《Effective C++》第1章 让自己习惯C++-读书笔记
章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...
- 人生效率手册:如何卓有成效地过好每一天--By张萌姐姐--读书笔记
读书笔记:<人生效率手册>:如何卓有成效地过好每一天--By张萌姐姐... 整本书看完的感受: 这本书主要讲的是生活中我们需要给自己一个目标,然后通过自己的努力去实现这个目标,书中说的很多 ...
- 《Effective C++》第3章 资源管理(2)-读书笔记
章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...
- 《Effective C++》第3章 资源管理(1)-读书笔记
章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...
随机推荐
- sql根据年月日查询注册数或者和值
//公司需要我做一个根据每天用户注册数量生成一个折现图,sql如下,//亲测好用,只是如果某一天没有注册的话,就不会显示日期 SELECT DATE_FORMAT(f.registDate, '%Y- ...
- Matlab函数
any() 相当于或操作,只要有1,就返回1 all() 相当于与操作,只要有0,就返回0 C = union(A,B): C为A和B的并集.去掉相同元素. C = intersect(A,B) C为 ...
- git开发过程的配置和使用
git开发过程的使用 1.创建仓库 2.新建项目,填写项目名称等信息 3.初始化仓库,创建git仓库 git init 4.配置个人信息(配置过可忽略) git config --global use ...
- CSS3 的box-shadow进阶之 - 动画篇 - 制作辐射动画
本篇文章是上一篇讲box-shadow基础知识的延伸,建议先花几分钟阅读那篇文章,点击阅读,再来看这篇. 除了box-shadow属性知识外,制作动画,还需要对CSS3的animation, @key ...
- python小数据池,代码块知识
一.什么是代码块? 根据官网提示我们可以获知: A Python program is constructed from code blocks. A block is a piece of Pyth ...
- Vue + Element UI 实现权限管理系统(国际化实现)
国际化支持 1.安装依赖 执行以下命令,安装 i18n 依赖. yarn add vue-i18n $ yarn add vue-i18n yarn add v1.9.4 warning packag ...
- Java连接SqlServer 2008数据库
将sqljdbc4.jar包添加到工程 连接SqlServer 2008数据库 import java.sql.Connection; import java.sql.DriverManager; i ...
- Edit Distance II
Given two strings S and T, determine if they are both one edit distance apart. Example Given s = &qu ...
- 运算类实现 及 GNU Makefile基本结构
1.运算类的实现,代码如下: (1)operator.cpp #include<iostream> #include "operator.h" using names ...
- html 经验之谈