发布于 2018-05-01 06:51:57
整个程序优化包括(实际上,至少对于C或C++和类似语言)跨翻译单位的内衬,因此有时(不恰当地)称为链路时间优化 (LTO),但仍然由编译器在链接步骤中运行。顺便说一句,LTO至少存在于20世纪90年代(甚至可能在大型机时代,1970年代)。
实际上,最近的编译器(如GCC或嘎吱声 )能够这样做,例如使用-flto 优化标志 (要传递,带有一些其他标志,如-O2、两种在编译和链接时 to gcc、clang、g++、clang++等等)。这在本质上是通过几乎重复优化工作来实现的:对于每个翻译单元,源代码的内部表示(例如,吉姆普 for GCC)也是在目标文件s中生成的。在“链接”时,所有这些表示再次被优化在一起。因此,整个编译时间(包括编译器中发生的“链接时间优化”)在实践中几乎翻了一番。
但是,链接时间优化通常是不值得的,因为在实践中,您需要加倍的构建时间才能在编译后的程序运行时获得几个百分点的性能(当然,这个经验法则也有例外)。
对于具有明确的模块概念的语言(并在某种类型的数据中重新定义它们的表示),或者对于同音语言,编译器也可能以一种不同的方式优化整个程序(通过仍然拥有整个程序的代码表示)。例如,查看斯大林或PolyML (甚至Ocaml、Go或SBCL )或凯亚或自性。即使是C++20标准也应该有模块。
(我不明白为什么研究人员把他们的原型软件命名为“斯大林”。这个名字对我来说太恶心了,以至于我在心理上无法尝试那个编译器。对于未来的学者:请仔细命名您的软件!)
发布于 2020-06-19 10:10:18
整个程序优化是跨方法边界进行的优化(我指的是Java/c#,而不是c/c++)。一个例子是高级技术全程序优化(libmin克拉夫特),它是高性能的盗版“我的世界”版本.这是一种内联然后优化的方法,它通过内联方法工作,而不考虑它们的大小,然后执行窥视孔优化。内嵌步骤通过将方法调用替换为方法体来增大方法的大小,从而可以执行更多的窥视孔优化,这几乎相当于对整个程序的静态分析。
唯一安全的全程序优化技术是内联技术.大多数全程序优化技术,你的编译器提供你只是变体内联。一些编译器只将内联作为整个程序优化的一部分,但具有不同的进攻性级别,有利于速度/大小。如果编译器给你更积极的优化,你可能会冒着把你的程序变成一个不安全的波音737 MAX 8设计崩溃的风险。另外,一些编译器甚至在peephole优化步骤之后执行内联操作,如果在peephole优化步骤之前执行,这就没有那么有用了。
https://softwareengineering.stackexchange.com/questions/370237
复制相似问题