效率(efficiency)
#
# , 这部分可以参考高性能C++相关的书籍
与运行时, 虚函数, 以及对象的内存模型相关的知识;
# Item 16:谨记 80-20 法则
要清楚80-20法则, 有时候还是根方效率, 也就是100个人里面, 只有10个人完成了一半的工作, 10000个人里面只有100个人完成了一半的工作;
- 只有20%代码占用了程序的80%的时间
- 需要对程序做合理的profile, 找出程序的热点函数
# Item 17:考虑使用 lazy evaluation(缓式评估)
考虑使用缓式评估(lazy evaluation): 可避免非必要的对象复制,可区别 operator[]的读取和写动作,可避免非必要的数据库读取动作,可避免非必要的数值计算动作
- Laze Fetching:产生Object对象的时候不从数据库里面取出文件,里面字段被用到的时候再取, copy on write;
- Lazy Expression Evaluation
- 用到的时候, 再把需要的中间变量计算出来, 不然过早计算, 可能后面会用不到,
- 避免不必要的重复冗余计算;
- 用到的变量, 也是这样, 过早声明定义, 有可能会浪费
# Item 18:分期摊还预期的计算成本
分期摊还预期的计算成本
SW Cache
Prefetch:
你可以把 prefetching 想象是购买大量物品时的一个折扣。例如,磁盘控制器,当它们从磁盘中读取数据时,读的是整个数据块或 sectors——即使程序只需其中少量数据。那是因为一次读一大块数据比分成两三次每次读小块数据,速度上快得多。此外,经验显示,如果某处的数据被需要,通常其邻近的数据也会被需要,这便是有名的 locality of reference 现象(译注:意指被取用的数据有“位置集中”的倾向)。系统设计者依此现象而设计出磁盘缓存(disk caches)、指令与数据的内存缓存(memory caches),以及“指令预先取出(instruction prefetches)”。
# Item 19:了解临时对象的来源
- 函数的变量传递(pass by value 或者 pass to reference-to-const)
- 函数的返回值(return to const极有可能会产生一个临时的对象)
# Item 20:协助完成“返回值优化(RVO)”
协助程序完成返回值优化(RVO) 在return by value的时候,
const rational(int a, int b){
return Rational(a + b); // 在最后return的语句里面,直接返回实例的表达式, 可以省去在函数体内部多出来的一个临时对象;
}
2
3
# Item 21:利用重载技术(overload)避免隐式类型转换(implicit type conversions)
overload一个global function来支持不同类型的参数, 从而避免隐式的类型转换
const UPInt operator+(int lhs, const UPInt& rhs);
# Item 22:考虑以操作符复合形式(op=)取代其独身形式(op)
考虑使用操作符复合形式(op=)取代其独立的形式(op)
+= 比 + 拥有更少的临时对象,
在类的里面, operator+ 调用operator+=
在类的外面, 全局重载的operator+, 调用了局部的operator+=
在进行操作符重载的时候, 独立形式的操作符也会使用复合形式的操作符重载来完成, 和++a a++一样, 都会有多余的overhead;
返回匿名对象的overhead不会比返回命名对象更多
template<T> const T operator+(const T& lhs, const T& rhs){ T result(lhs); return result += rhs; }
1
2
3
4
5
# Item 23:考虑使用其他程序库
观点在工作执行的时候, 其实不需要考虑很多;
但是反过来论述工作的重要性和优越性的时候, 需要这些角度和观点的切入;
积极使用其他的库,(更快的性能, 更小的代码体积,效率,扩展性,移植性考虑在内)(这里整理一些不错的C++库,可以用来学习, 也可以用来搜集)
- 基础库
- 网络库
- 计算库
- 存储库
- json库
比如OneDNN / MKL、 libevent, 以及一些网络的库
# Item 24:了解 virtual functions、multiple inheritance、virtual base classes、runtime type identification的成本
时间空间成本(主要是对象模型相关的内容)
虚函数,
多重继承,
虚基类,
RTTI
他们的成本代价都是一些什么?