1ms Faster
Home
  • Program

    • Lean in C++
  • Perfromance Engineering

    • [>>>>>]
  • Reading Note

    • [>>>>>]
  • ComputeArch

    • [_]
  • Compiler

    • [_]
  • System

    • [_]
Authoring
  • Categories
  • Tags
GitHub (opens new window)

Quincy Jet

We are.
Home
  • Program

    • Lean in C++
  • Perfromance Engineering

    • [>>>>>]
  • Reading Note

    • [>>>>>]
  • ComputeArch

    • [_]
  • Compiler

    • [_]
  • System

    • [_]
Authoring
  • Categories
  • Tags
GitHub (opens new window)
  • Lean in c++

  • Performance Engineering

  • Misc

  • Reading Notes

    • Effective C++

    • More Effective C++

      • 基础议题
      • 操作符(operators)
      • 异常(exceptions)
      • 效率(efficiency)
        • , 这部分可以参考高性能C++相关的书籍
          • Item 16:谨记 80-20 法则
          • Item 17:考虑使用 lazy evaluation(缓式评估)
          • Item 18:分期摊还预期的计算成本
          • Item 19:了解临时对象的来源
          • Item 20:协助完成“返回值优化(RVO)”
          • Item 21:利用重载技术(overload)避免隐式类型转换(implicit type conversions)
          • Item 22:考虑以操作符复合形式(op=)取代其独身形式(op)
          • Item 23:考虑使用其他程序库
          • Item 24:了解 virtual functions、multiple inheritance、virtual base classes、runtime type identification的成本
      • 技术(techniques, idioms, patterns)
      • 杂项讨论,Misc
    • 《C++ 性能优化指南》
  • Wiki
  • Reading Notes
  • More Effective C++
Quincy Jet
2022-06-27
Content

效率(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:分期摊还预期的计算成本

分期摊还预期的计算成本

  1. SW Cache

  2. Prefetch:

    你可以把 prefetching 想象是购买大量物品时的一个折扣。例如,磁盘控制器,当它们从磁盘中读取数据时,读的是整个数据块或 sectors——即使程序只需其中少量数据。那是因为一次读一大块数据比分成两三次每次读小块数据,速度上快得多。此外,经验显示,如果某处的数据被需要,通常其邻近的数据也会被需要,这便是有名的 locality of reference 现象(译注:意指被取用的数据有“位置集中”的倾向)。系统设计者依此现象而设计出磁盘缓存(disk caches)、指令与数据的内存缓存(memory caches),以及“指令预先取出(instruction prefetches)”。

# Item 19:了解临时对象的来源

  1. 函数的变量传递(pass by value 或者 pass to reference-to-const)
  2. 函数的返回值(return to const极有可能会产生一个临时的对象)

# Item 20:协助完成“返回值优化(RVO)”

协助程序完成返回值优化(RVO) 在return by value的时候,

const rational(int a, int b){
    return Rational(a + b);  // 在最后return的语句里面,直接返回实例的表达式, 可以省去在函数体内部多出来的一个临时对象;
}
1
2
3

# Item 21:利用重载技术(overload)避免隐式类型转换(implicit type conversions)

overload一个global function来支持不同类型的参数, 从而避免隐式的类型转换

const UPInt operator+(int lhs, const UPInt& rhs); 
1

# 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

他们的成本代价都是一些什么?

异常(exceptions)
技术(techniques, idioms, patterns)

← 异常(exceptions) 技术(techniques, idioms, patterns)→

Copyright © 2017-2023 Quincy Jet | MIT License
  • Auto
  • Light
  • Dark
  • Read