Superoptimization:普通编译器做不到的极致优化,怎么搜出来?
TL;DR
Superoptimization 把一小段程序当成谜题,搜索更短或更快的机器级实现,再用约束求解器验证候选方案是否等价。本文解释它和普通编译器优化的区别,以及为什么 AI 生成的短代码不等于高性能代码。
Superoptimization 把一小段程序当成谜题,搜索更短或更快的机器级实现,再用约束求解器验证候选方案是否等价。本文解释它和普通编译器优化的区别,以及为什么 AI 生成的短代码不等于高性能代码。

编译器优化通常有明确规则:消除无用代码、合并常量、把循环展开,或者把函数调用内联。但机器指令的组合空间非常大,规则写得再多,也不可能穷举所有短小而正确的实现。Superoptimization,中文常译作“超优化”,就是把一个小程序当成谜题,直接搜索更短或更快的机器级实现。
它和普通优化有什么不同
普通编译器通常在速度和编译时间之间取平衡。它希望在几秒或几分钟内,把很大的程序优化到“足够好”。超优化器则可以为一段很小的热代码花更长时间,枚举指令序列、建立约束,再验证候选实现是否与原程序等价。
以一段 LLVM IR 为例,工具可能先观察输入输出关系,再尝试生成不同的指令组合。候选方案不能只看文本长度,还要考虑寄存器、分支、目标 CPU 的指令集,以及未定义行为和溢出语义。一个看起来更短的方案,如果在边界输入上算错,就不能称为优化。
为什么搜索不会立刻爆炸
真正的超优化不会把所有机器指令无限排列。它会限制序列长度、操作数范围和可用指令集,并利用 SMT 求解器检查“是否存在某个输入让新旧程序结果不同”。如果找不到反例,候选就更有机会被接受;如果找到了反例,搜索会继续排除这一类方案。
这说明超优化的核心不是蛮力,而是搜索、约束和证明的组合。搜索负责提出新想法,约束求解器负责过滤,成本模型负责排序,最终还要在真实目标上测试。
它什么时候有价值
密码学原语、编解码内核、数据库热点循环、数学库函数和嵌入式代码,都可能值得做局部超优化。普通业务代码通常不适合,因为编译时间、验证成本和维护成本会很快超过收益。
对 AI 编程来说,超优化提供了一个重要提醒:AI 生成的“更短代码”不等于更高性能。真正的优化必须说明目标机器、输入边界、正确性证据和基准结果。把代码改漂亮只是重写,把可验证的等价实现改得更快,才接近超优化。
读者应该记住
Superoptimization 的问题可以概括为:“有没有一段更小的程序,能在所有允许输入上得到同样结果?”它把优化从经验规则推向程序搜索与形式化验证,但最适合小而关键的代码片段。



