全书学习地图

按第一版官方11章组织学习路线:从C++契约与测量,到数据/迭代器/算法,再到内存、编译期、惰性求值和并行执行。

学习目标

  • 能描述第一版官方11章从语言契约、测量、数据表示到并行执行的依赖关系
  • 能设计“假设、基线、剖析、修改、复测”的性能优化闭环
  • 能判断一个优化应进入算法、布局、生命周期、编译期、并发或GPU哪一层

机制总览

全书学习地图:机制路径

  1. 1

    从官方11章开始

    《C++ High Performance》第一版不是“缓存、线程、模板技巧”的随意集合。它先建立C++ object/value/ownership契约,再补现代语言设施;随后说明如何测量,才进入data structures、iterators与algorithms;内存、metaprogram…

  2. 2

    阶段一:语言契约与可核查测量

    第1章建立zero-cost abstraction、value semantics、ownership、reference和error handling。它回答“接口实际承诺了什么成本与lifetime”。第2章扩展到auto、lambda、move、optional与any,回答“现代语法怎样保…

  3. 3

    阶段二:让算法看到正确的数据形状

    第4章从memory properties出发比较array/vector/deque/list、ordered/unordered containers与parallel arrays。第5章解释iterator concept、category、traits、tag dispatch和linea…

先按顺序建立机制,再进入实验切换阶段并检查失效证据。

章级决策实验

全书学习地图:机制与证据

切换《全书学习地图》的三个关键教学阶段,先解释机制,再用运行与失败证据验证结论。

选择推理阶段

当前阶段 · 从官方11章开始

《C++ High Performance》第一版不是“缓存、线程、模板技巧”的随意集合。它先建立C++ object/value/ownership契约,再补现代语言设施;随后说明如何测量,才进入data structures、iterators与algorithms;内存、metaprogram…

可核验证据

保留可复现基准、输入规模和编译参数,用采样剖析与硬件计数器核对「从官方11章开始」前后的时间和资源变化。

学完《全书学习地图》后,应能从输入和前置条件推导状态变化,并用可重复的构建、运行或边界测试证明结果。

失效—证据矩阵

全书学习地图:失效与核验

从官方11章开始

典型失效

若脱离基线与成本模型讨论「从官方11章开始」,局部优化可能只是在移动开销,甚至让缓存、分配或同步瓶颈更严重。

核验证据

保留可复现基准、输入规模和编译参数,用采样剖析与硬件计数器核对「从官方11章开始」前后的时间和资源变化。

阶段一:语言契约与可核查测量

典型失效

若脱离基线与成本模型讨论「阶段一:语言契约与可核查测量」,局部优化可能只是在移动开销,甚至让缓存、分配或同步瓶颈更严重。

核验证据

保留可复现基准、输入规模和编译参数,用采样剖析与硬件计数器核对「阶段一:语言契约与可核查测量」前后的时间和资源变化。

阶段二:让算法看到正确的数据形状

典型失效

若脱离基线与成本模型讨论「阶段二:让算法看到正确的数据形状」,局部优化可能只是在移动开销,甚至让缓存、分配或同步瓶颈更严重。

核验证据

保留可复现基准、输入规模和编译参数,用采样剖析与硬件计数器核对「阶段二:让算法看到正确的数据形状」前后的时间和资源变化。

每个判断都必须能落到观测、测试或产物,不能只凭代码表面推测。

从官方11章开始

《C++ High Performance》第一版不是“缓存、线程、模板技巧”的随意集合。它先建立C++ object/value/ownership契约,再补现代语言设施;随后说明如何测量,才进入data structures、iterators与algorithms;内存、metaprogramming和lazy proxy负责改变representation与evaluation;最后用concurrency和Parallel STL讨论执行资源。

先预测一个性能问题属于哪一章的contract,再读对应章节。若连metric和workload都没定义,应回到第3章;若algorithm growth不成立,应先修第4-6章相关选择;若单线程representation已稳定,才进入第10-11章并行化。

阶段一:语言契约与可核查测量

第1章建立zero-cost abstraction、value semantics、ownership、reference和error handling。它回答“接口实际承诺了什么成本与lifetime”。第2章扩展到auto、lambda、move、optional与any,回答“现代语法怎样保留或隐藏copy、capture和type erasure”。第3章定义asymptotic/amortized complexity、performance properties、testing与profilers,回答“证据怎样成立”。

Chapter 1  contract: value / borrow / own / fail
Chapter 2  representation: auto / closure / move / optional / any
Chapter 3  evidence: metric / workload / benchmark / profile

这三章不能跳过。没有ownership,优化可能变成use-after-free;没有type/capture推理,lambda或std::function成本无法判断;没有measurement protocol,所有“变快”都可能只是噪声或错误边界。

阶段二:让算法看到正确的数据形状

第4章从memory properties出发比较array/vector/deque/list、ordered/unordered containers与parallel arrays。第5章解释iterator concept、category、traits、tag dispatch和linear range,让algorithm只依赖真实遍历能力。第6章用STL algorithms、predicate/comparator、partial sorting和ranges composition表达意图。

这一阶段的主线不是“背哪个容器快”,而是从access pattern反推representation。连续scan偏向compact sequence,range query偏向ordering,field-wise batch偏向parallel arrays;category必须真实,comparator必须strict weak ordering;只需top-k就不建立完整total order。

access pattern -> container/layout -> iterator capability
               -> algorithm precondition -> complexity + locality

阶段三:改变storage、编译期与求值时机

第7章把virtual pages、stack/heap、placement new、alignment、RAII、small size optimization与arena串成storage/lifetime链。第8章用TMP、traits、detection、constexpr、heterogeneous containers与compile-time hash移动type-level工作。第9章借string proxy、DistProxy和operator DSL解释lazy evaluation。

三章分别改变“放在哪里”“何时决定”“何时计算”。arena若不匹配共同lifetime会保留peak memory;template specialization若类型组合爆炸会增加compile time和binary;lazy proxy若借用temporary会悬空,若重复conversion会重算。优化必须连同代价迁移一起记录。

storage time     allocate -> construct -> own -> destroy -> release
compile time     detect -> select -> instantiate -> emit code
evaluation time  capture expression -> compare/fuse -> materialize

阶段四:共享执行与并行算法

第10章从concurrency/parallelism、mutex、condition variable、task进入atomic memory model和lock-free queue,再诊断contention、affinity与false sharing。第11章把divide-and-conquer、count/copy_if、execution policies、reduce家族延伸到GPU/OpenCL。

并行化的前提不是“CPU还有核”,而是work可拆、chunk独立、merge便宜且数据访问不会先饱和bandwidth。release/acquire需要可写出的happens-before证明;parallel copy_if需要output position协议;GPU需要把transfer与kernel一起算进end-to-end。

性能决策不是单向阶梯

读完11章后,实际问题会在各层来回迭代。profile显示allocator热点,原因可能是第4章container churn,也可能是第9章eager temporary;parallel scaling停止,原因可能是第10章contention,也可能是第4章layout造成bandwidth饱和。

每轮只修改能回答当前hypothesis的因素。若改container同时换compiler flags和input,就无法归因;若只报告最快一次,也无法评估uncertainty。失败实验也应保留,因为它排除了cause并防止团队重复猜测。

阅读每章的统一方法

每章使用同一套四问:

  1. Contract:调用者能依赖什么语义、复杂度、lifetime和ordering?
  2. Representation:对象、iterator、expression或task内部保存什么?
  3. Evidence:需要代码、type proof、benchmark还是profile来验证?
  4. Boundary:input size、implementation、hardware或thread model变更后结论是否仍成立?

先读本章三张图建立状态关系,再运行代码/推导练习,最后回答带答案的工程题。不要只背结论;把“为什么成立、何时失效”写出来,才算掌握。

全书证据门禁

章节学习与工程优化都应经过四类门禁:contract tests/TSan/ASan证明correctness;官方outline证明内容没有漏章;benchmark/profile证明性能结论;复测与CI证明改动不会轻易回归。任何一类缺失都只能叫hypothesis,不叫完成。

推荐学习安排

按官方顺序完成11章,每章至少经历“预测、图示、代码、练习、复测”五步。第1-3章建立共同语言;第4-6章完成第一个container/algorithm小项目;第7-9章完成storage与lazy expression实验;第10-11章完成serial-to-parallel对照。最后进入总复习,用一条完整案例串联所有层。

学习顺序可因项目问题局部跳转,但补课依赖不能省。例如为false sharing直接读第10章时,仍需回看第4章cache/data layout与第3章measurement;为GPU算法读第11章时,要先理解第6章algorithm contract和第10章shared execution。

小结

  • 第一版官方结构是11章,不是旧内容中的10章或九章摘要
  • 第1-3章建立语言成本契约和可信测量,第4-6章连接数据、迭代器与算法
  • 第7-9章分别改变storage、compile-time decision与evaluation timing
  • 第10-11章建立共享执行、memory order、parallel algorithm和GPU边界
  • 每个结论都用contract、representation、evidence与boundary四问核查
  • 性能优化是可证伪闭环,不是从“低级”到“高级”的单向技巧列表

资料与写作方式声明

本章以C++ High Performance, First Edition, official 11-chapter route权威目录界定学习范围,并结合正文列出的技术资料独立重写;不宣称复现原书正文,也不沿用原作表述。

原作版权归作者与出版社所有;本站原创教学结构与表述仅供学习交流。

名词解释

本章出现的专业名词,用大白话再讲一遍。

官方章节路线

由出版社目录核对的11章内容顺序。

成本契约

接口公开的语义、lifetime、复杂度和错误承诺。

数据形状

数据布局、字段分组、索引与遍历顺序。

生命周期边界

storage与object从取得到释放的时间关系。

执行协议

work划分、同步、合并和失败处理规则。

性能闭环

假设、基线、定位、修改、复测和再剖析循环。

证据门禁

correctness、fidelity、measurement和regression的联合验收。

练习

  1. 问题 1:一个服务p99变慢且allocator占CPU样本25%,应按哪些章节顺序排查? 给出可证伪路径。
  1. 问题 2:一个parallel transform只快1.4倍,应如何连接第3、4、10、11章? 区分粒度、带宽和争用。
  1. 问题 3:为团队制定本书的章节验收规则。 必须包含内容与工程证据。

讨论

评论区加载中…