用途:为五类常见循环变换提供“手写还是交给编译器”的决策规则,核心价值在于识别哪些手工优化是冗余的(编译器已做)、哪些是有害的(破坏向量化或误导基准测试)。
主要能力与决策规则:先剖析,profiler 未证明是热点循环就不要优化。在 C/C++/Rust 中,循环不变量外提(LICM)和强度削减在 -O2/-O3 下自动执行,手工写法冗余;展开也交给编译器,虽非默认开启(GCC 需 -funroll-loops),但收益判断由编译器掌握,手工展开常破坏自动向量化。若循环无法向量化,先修别名(restrict / restrict)和循环形状,用优化报告确认(-fopt-info-vec-missed、-Rpass-missed=loop-vectorize),最后才用 intrinsics 并接受可移植性代价。仍值得手写的变换:编译器遗漏的显式 SIMD、循环融合(防寄存器与缓存压力)、多累加器展开以打断编译器合法上不会重排的浮点归约链。Python 手段是外提不变量、用 NumPy 向量化、用 numexpr/Numba 融合;不要手工展开或强度削减,其瓶颈是字节码分发。
无分支化:独立于上述五类变换,编译器不会自动做,因为把条件 push 改为无条件存储加条件索引推进改变了写入内存,LLVM 无法作为保语义变换应用。其杠杆是分支误预测(每次约 15-20 周期),可预测分支无需处理。适用条件是谓词接近随机且最坏情况有害;当选择性稳定偏斜或输入已排序/聚簇时应跳过。它让开销与数据无关,而非更快:50% 最坏情况约快 4 倍,1% 最好情况约慢 2 倍。代价是输出缓冲区按全长分配,且可读性变差,增加维护成本。
两个陷阱:合成基准陷阱(在小而合成的输入上验证的微优化在生产数据上可能反而更慢,应在生产分布数据上用优化屏障基准测试);“已生成不等于已执行”(自动向量化会静默失败,需用代码生成或优化报告确认,而非看源码)。
适用场景:审查热点循环中出现手工展开、移位代替乘法、定制 SIMD 时;编写已被剖析证明热点的循环时;反驳某个循环微优化“更快”的说法时。限制:循环未被 profiler 证明为热点则不该用;架构级性能问题应查 pensive:architecture-review;复杂度热点(O(n^2))应查 pensive:performance-review。每个加速声明都需在生产分布数据上有基准证据。URL:https://www.skills.sh/athola/claude-night-market/loop-optimization