随着时间的推移,编译器在优化代码方面是否变得越来越好,如果是,优化速度是多少?

Are compilers getting better at optimizing code over time, and if so at what rate?

例如,我们知道摩尔定律指出芯片上的晶体管数量每 1.8-2 年翻一番(因此计算能力一直以这个速度大致增长)。这让我想到了编译器优化。随着时间的推移,编译器是否会变得更好,使代码 运行 更快?如果是,是否有任何关于这种性能增加规模的理论?如果我要使用一段 1970 年编写的代码,使用 1970 年的编译器优化进行编译,同样的代码 运行 在同一台机器上会更快,但使用今天的优化进行编译吗?我可以期望今天编写的一段代码比 运行 快 100 年,仅仅是因为更好的 optimizations/compilers(显然独立于硬件和算法改进的改进)吗?

这是一个复杂的、多方面的问题,所以让我试着抓住几个要点:

  • 编译器优化理论非常复杂,而且通常(远)比语言的实际设计更难。该领域包含许多其他复杂的数学子领域(例如,有向图论)。已知编译器优化理论中的一些问题是 NP 完全问题甚至是不可判定的(代表要解决的最复杂的问题类别)。
  • 虽然有数百种已知技术(例如,参见 here),但这些技术的实施高度依赖于计算机语言和目标 CPU(例如指令集和管道)。由于计算机语言和 CPU 不断发展,即使是众所周知的技术的最佳实现也会随着时间的推移而变化。新的 CPU 功能和架构还可以开启以前无法使用的优化技术。一些最尖端的技术也可能是专有的,因此一般 public 无法重用。例如,一些商业 JVM 为 Java 字节码的 JIT 编译提供专业优化,在统计基础上在数量上优于(默认)开源 JVM。
  • 编译器优化越来越好是一个明确无误的历史趋势。这就是为什么,例如,现在很少有人定期进行任何手动汇编编码。但是由于已经讨论过的(以及其他)因素,自动编译器优化所提供的效率和好处的演变在历史上一直是非线性的。这与摩尔定律和其他与计算机硬件改进相关的定律相当一致的曲率形成对比。编译器优化的跟踪记录可能更好地可视化为包含许多 "fits and starts" 的一行。因为推动编译器优化理论非线性的因素在不久的将来不太可能改变,所以这个轨迹很可能至少在不久的将来会保持非线性。
  • 当语言本身来来去去时,即使是平均改进率也很难说,更不用说 CPU 具有不同硬件功能的模型来来去去。 CPU 随着时间的推移已经发展出不同的指令集和指令集扩展,因此甚至很难进行 "apples to apples" 比较。无论您使用哪种度量标准都是如此:根据离散指令的程序长度、程序执行时间(高度依赖于 CPU 时钟速度和流水线功能)或其他。
  • 编译器优化理论现在可能处于衰落状态 returns。也就是说,大多数 "low hanging" 的成果都已得到解决,而其余的大部分优化要么相当复杂,要么提供的边际改进相对较小。也许对编译器优化理论产生颠覆性影响的最大未来因素将是弱(或强)AI 的出现。因为编译器优化理论的许多未来成果将需要高度复杂的预测能力,所以最好的优化器实际上将具有某种程度的先天智能(例如,预测最常见的用户输入,预测最常见的执行路径,以及将 NP-hard 优化问题减少为可解决的子问题等)。很可能在未来,您使用的每个软件都是根据您的特定用例、兴趣和要求以量身定制的方式专门为您定制编译的。想象一下,您的 OS(操作系统)是根据您的特定用例专门为您编译或重新编译的,作为科学家、视频游戏玩家、企业高管,或老年人与年轻人,或任何可能影响代码执行的其他人口统计组合。