首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >全程序优化

全程序优化
EN

Software Engineering用户
提问于 2018-05-01 05:22:13
回答 2查看 1.8K关注 0票数 1

我只是询问了多面体模型,并研究了其他编译器优化(回路展开常量折叠与传播死码消除等)。

但是我还没有看到关于整个程序转换/优化的任何东西。想知道是否有任何关于这个问题的材料或技巧。一个例子是以整个程序为例,在整个程序的规模上重新排序函数调用和变量使用,以使其更加优化(而不是单个循环或基本块的规模)。

我特别想知道,这个优化器如何将一个高级函数(引用多个其他函数/高级函数)替换为另一个函数。与这些函数的集合相同。优化器必须以某种方式知道程序员的意图,但谁知道,也许他们已经想出了一种方法。

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2018-05-01 06:51:57

整个程序优化包括(实际上,至少对于C或C++和类似语言)跨翻译单位内衬,因此有时(不恰当地)称为链路时间优化 (LTO),但仍然由编译器在链接步骤中运行。顺便说一句,LTO至少存在于20世纪90年代(甚至可能在大型机时代,1970年代)。

实际上,最近的编译器(如GCC嘎吱声 )能够这样做,例如使用-flto 优化标志 (要传递,带有一些其他标志,如-O2两种在编译和链接时 to gccclangg++clang++等等)。这在本质上是通过几乎重复优化工作来实现的:对于每个翻译单元,源代码的内部表示(例如,吉姆普 for GCC)也是在目标文件s中生成的。在“链接”时,所有这些表示再次被优化在一起。因此,整个编译时间(包括编译器中发生的“链接时间优化”)在实践中几乎翻了一番。

但是,链接时间优化通常是不值得的,因为在实践中,您需要加倍的构建时间才能在编译后的程序运行时获得几个百分点的性能(当然,这个经验法则也有例外)。

对于具有明确的模块概念的语言(并在某种类型的数据中重新定义它们的表示),或者对于同音语言,编译器也可能以一种不同的方式优化整个程序(通过仍然拥有整个程序的代码表示)。例如,查看斯大林PolyML (甚至Ocaml、Go或SBCL )或凯亚自性。即使是C++20标准也应该有模块

(我不明白为什么研究人员把他们的原型软件命名为“斯大林”。这个名字对我来说太恶心了,以至于我在心理上无法尝试那个编译器。对于未来的学者:请仔细命名您的软件!)

票数 7
EN

Software Engineering用户

发布于 2020-06-19 10:10:18

整个程序优化是跨方法边界进行的优化(我指的是Java/c#,而不是c/c++)。一个例子是高级技术全程序优化(libmin克拉夫特),它是高性能的盗版“我的世界”版本.这是一种内联然后优化的方法,它通过内联方法工作,而不考虑它们的大小,然后执行窥视孔优化。内嵌步骤通过将方法调用替换为方法体来增大方法的大小,从而可以执行更多的窥视孔优化,这几乎相当于对整个程序的静态分析。

唯一安全的全程序优化技术是内联技术.大多数全程序优化技术,你的编译器提供你只是变体内联。一些编译器只将内联作为整个程序优化的一部分,但具有不同的进攻性级别,有利于速度/大小。如果编译器给你更积极的优化,你可能会冒着把你的程序变成一个不安全的波音737 MAX 8设计崩溃的风险。另外,一些编译器甚至在peephole优化步骤之后执行内联操作,如果在peephole优化步骤之前执行,这就没有那么有用了。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/370237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档