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



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

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

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

最新更新