likes
comments
collection
share

【读书笔记】《More Effective C++》 - 效率

作者站长头像
站长
· 阅读数 10

《More-Effective-C++》读书笔记

效率

条款16 谨记80-20法则

这一条款说明影响程序运行效率的代码一般只占总代码的20%,使用程序分析器分析出造成性能瓶颈的对应代码。

条款17 考虑使用lazy evaluation(缓式评估)

缓式评估的思想是延缓运算,知道必须要的时候。对于你的软件被要求执行某些计算,而那么计算其实可以避免的场景,缓式评估有一定效率提升。书中举例说明了缓式评估可以提高效率的四个场景:

  • Reference Counting(引用计数): 避免非必要的对象复制。
  • 区分读与写: 写操作比读操作更耗时,用缓式评估和proxy classes来区分operator[]的读与写操作。
  • Lazy Fetching(缓式取出): 针对读取数据库数据并实例化大对象。这样一个大数据对象往往比较耗时,则一开始只产生该对象的“外壳”,不从数据库中读取数据,直到某个字段被真正需要。
  • Lazy Expression Evaluation(表达式缓评估): 避免非必要的数值计算。

条款18 分期摊还预期的计算成本

与条款17不同,这一条为超急评估(over-eager evaluation),在被要求之前就先把事情做下去。针对的场景是如果你的程序常常会用到某个计算,可以设计一份数据结构以便能够极有效率的处理需求,常见的做法有caching(数值缓存)和Prefetching(预先取出)。

条款19 了解临时对象的来源

这里说的临时对象是指没有命名的non-head object,此类的对象比较隐蔽,其对应的构造和析构函数也会对你的程序性能造成影响。书中给出了生成临时对象的常见两种场景:

  • 函数调用时的隐形类型转换
  • 函数返回值为一个对象(by value),如operator+。

条款20 协助完成"返回值优化(RVO)"

应尽可能避免返回对象,必须要返回时以返回constructor arguements取代对象。 eg.

const Rational operator*(const Rational& lhs,
                         const Rational& rhs)
{
    return Rational(lhs.numerator() * rhs.numerator(),
                    lhs.denominator() * rhs.denominator());
}

条款21 利用重载技术(overload)便面隐式类型转换(implict type coversions)

隐式类型转换应能避免就避免,多重载几个函数以支持多种合法type,减少隐式类型转换发生次数。

条款22 考虑以操作符复合形式(op=)取代其独身形式(op)

以op=为基础实现op。

条款23 考虑使用其他程序库

根据场景以及性能瓶颈选择合适的library。

条款24 了解virtual functions, multiple inheritance, virtual base classes, runtime type identification的成本

性质对象大小增加Class数据量增加Inlining几率增加
虚函数
多重继承
虚拟基类往往如此有时候
运行时期类型辨识