本节摘要:优化是一种纪律而不是一堆技巧:先立可复现的基线,再用第 7 章的方法归因,然后按"算法、数据布局、向量化、指令微调"的顺序从高收益层做起,每一步用数字验收。本节把这套纪律走成一次完整战役,并给出汇编层优化清单与三类常见的"负优化"陷阱。
技巧俯拾皆是,纪律千金难买。前几节攒下的所有武器——流水线模型、NEON、内联汇编——如果没有一套排兵布阵的方法,就只是武器架子。本节给出这套方法。它只有四步,但每步都有铁的规矩:没有数字的主张不算主张。
第一步,立基线。 固定输入、固定环境、固定计时方法,跑出可复现的数字。三个易错点:计时器选对(裸机用 cntvct_el0 虚拟计时器,用户态用单调时钟,别用墙钟);预热要做(首跑带着缓存冷启动与页面调度的噪声);多轮取中位数(单次测量说不了话)。基线的意义在复测时兑现——没有它,"快了"二字无处落脚。
第二步,归因。 用 7.2 节的四步法把"慢"落到具体函数与指令类型上,得出瓶颈判定:访存型、运算型还是同步型。归因结论决定优化战场——在访存瓶颈上抠指令微调,等于给漏水的船抛光。
第三步,分层变换。 按收益与风险的排序做:算法层(换算法,数量级收益,通常超出本章职权但必须先问);数据布局层(访问顺序、结构体排布、打包密度,常拿数倍收益);向量化与指令选择层(8.2 节的武器,两到数倍);指令微调层(8.1 节的交织与消分支,个位数到两成)。从上往下做,原因很朴素:下层优化的收益会被上层的改动整个覆盖——先抠指令再改布局,抠的全白抠。
第四步,复测与固化。 同一基线环境下重跑,数字说话;收益达标的变换写注释固化(为什么快、依据哪个假设),假设失效时(换平台、换数据规模)注释就是拆除引信的说明书。

把纪律落到可执行的检查单。访存优先:循环内的访存是否按地址递增顺序扫过内存(顺向对预取器友好);热数据的结构体是否把常用字段排在一起(缓存行 64 字节,一行装下多少决定miss率);大数组遍历是否内层连续(行优先列优先的老问题,8.2 节实验里那个转置就是它)。分支其次:热路径上的分支能否合并或消掉(csel、无分支序列);预测不友好的分支(数据依赖早退)能否改成无条件计算加选择。指令密度最后:乘八用移位还是乘法(现代处理器乘法够快,别为移位牺牲可读性——这条多数老经验已过时);成对搬运用上 ldp 与 stp 没有;有没有重复计算同一个表达式可以提到循环外。每条做完,复测。
一个必做的对照实验收尾:把同一份"按列遍历大数组"的代码分别在 -O0 与 -O3 下计时,再改成按行遍历各测一次。四个数字通常呈现这样的关系——-O3 无法挽救错误的遍历顺序(行列差距依旧悬殊),而正确的顺序连 -O0 都能跑赢错误的顺序加优化。解读:数据布局是优化器帮不了你的部分,这正是汇编工程师与性能工程师的核心价值区。
8.3 的四步纪律值得走一遍完整的。战役对象:一个按列遍历的矩阵转置,规模千乘千,基线计时定为 100。第一回合(归因):性能计数器显示每周期指令数极低、访存未命中计数爆表——访存型瓶颈,战场在数据布局而非指令选择。第二回合(布局层):把按列遍历改成按行遍历加分块(块尺寸取缓存行的整数倍,让每个缓存行被完整消费后再换行),计时降到 38——一个变换吃掉六成时间。第三回合(向量化层):内层循环规整了,交给自动向量化,降到 21;手写 NEON 尝试到 19,收益两个点——按 8.2 节的结论,此场景编译器已近极限,手写收益不值得维护成本,采用自动版固化。第四回合(复测与注释):换两台不同缓存容量的机器复测,分块尺寸重新标定后固化,注释写明"分块尺寸假设与缓存行等长,换平台需重标"。
三个回合的收益分布(38 比 21 比 19)就是 8.3 正文的层次理论的实证:布局层六成、向量化层近半、指令微调层零头。把它背下来的价值在于先验的收益预期——开工前就知道每层大概值多少,就不会在零头层里消耗主战场的时间。
问:优化到什么程度该停? 答:三停原则——收益低于测量噪声停、可读性损失不可逆停、假设绑定具体平台且平台会换停。性能工作的终点不是极限,是"收益与维护成本的交点";交点之前每一步都有数字护航,交点之后全是负资产。
四步纪律的第一步看似最简单,其实暗礁最多。四种噪声会让基线骗人。噪声一,频率调节:处理器为省电动态调频,冷启动阶段跑在低频,前几轮测量天然偏慢——预热轮次不是仪式,是把频率与缓存都拉进工作态。噪声二,系统调度:后台任务随时抢核,单轮测量可能整个落在一个被打扰的时间窗里——多轮取中位数就是对冲它的最低成本手段。噪声三,代码与数据的物理布局:链接地址、页面对齐、缓存组冲突都会让两份逻辑等价的代码性能差出一截——对比实验要保证两版布局条件一致,只差目标变量。噪声四,测量代码自身:计时调用不是免费的,过细的计时粒度(每轮循环都读时钟)会把测量开销混进数据——按批计时再摊回,是最省心的折中。
把这四种噪声背下来还有一层意义:当别人拿着一张单次测量截图主张优化收益时,你能立刻问出四个校验问题(预热了吗、几轮取的什么、布局一致吗、计时开销算了吗)。性能讨论的质量,从测量讨论开始。
优化纪律齐了。最后一节把视野拉到工程与产业:规范、安全与生态走向。