`-Os` 和 `-Oz` 在 rustc 中有什么优化作用?

34
执行rustc -C help命令会显示以下内容(除其他信息外):

-C opt-level=val       -- optimize with possible levels 0-3, s, or z

The levels 0 to 3 are fairly intuitive, I think: the higher the level, the more aggressive optimizations will be performed. However, I have no clue what the s and z options are doing and I couldn't find Rust-related information about them.


-Os 像 -O2 一样,但具有额外的优化以减小代码大小。-Oz 像 -Os(因此也是 -O2),但进一步减小了代码大小。 - wasmup
3个回答

22

看起来你并不是唯一感到困惑的人,正如在 Rust问题中描述的那样。它似乎遵循与Clang相同的模式:

  • Os 用于编译时最大化优化大小。
  • Oz 用于更进一步的大小优化。

我猜“z”是指尽可能接近“零”大小? - user541686
4
@Mehrdad 我想s更多是代表大小写字母中的小写,而z则代表大写。 - Ruslan
1
你能详细描述一下 sz 在优化中怎么和 0-3 相比工作的吗?它们是完全不同的优化配置吗?还是说像是“类似于 2,再加上一些额外的优化处理”之类的东西? - Lukas Kalbertodt

15

通过查看Rust源代码中的这些这些行,我可以说s表示优化尺寸,z表示更进一步优化尺寸。

所有的优化似乎都由LLVM代码生成引擎执行。


2
你能否更详细地描述一下sz相对于0-3的工作方式?它们是完全不同的优化配置文件吗?还是像“2加上几个额外的优化步骤”之类的东西? - Lukas Kalbertodt
1
@LukasKalbertodt 既然这些优化是由 LLVM 执行的而不是特定于 Rust 的,因此您应该查阅 LLVM 文档。 - the8472

3

LLVM中的这两个序列Os和Oz非常相似。在LLVM 12.0中,Oz调用了260个通行证,而Os调用了264个。除了一个不同的通行证(opt-loops)位于Os中的不同位置外,Oz的分析和优化序列几乎是严格子序列。尽管如此,请注意优化的效果可能仍然不同,因为它们使用不同的成本模型,例如确定优化行为的常量。因此,对大小有影响的优化(如循环展开和内联)在这两个序列中的行为可能会有所不同。


非常有用的信息,谢谢!你能否提供一些列出这些步骤的文档的链接?(可以是代码或文档)。 - Lukas Kalbertodt
嗨@LukasKalbertodt,你可以通过以下方式检查优化级别调用的传递:llvm-as < /dev/null | opt -O3 -disable-output -debug-pass=Arguments我们有一篇论文,分析了不同大小缩减级别的有效性在此处。还有一份技术报告附带着论文,含有一些新的代码大小缩减序列在此处 - Fernando Magno Quintao Pereira

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接