gpt4 book ai didi

配置为 'release' 时 Swift 构建时间太长?

转载 作者:搜寻专家 更新时间:2023-10-31 19:32:55 24 4
gpt4 key购买 nike

我有一个开源项目,项目中的文件数超过 40。

我在配置为Debug并且编译时间为2m22s时构建项目。我也用 BuildTimeAnalyzer ,最长的时间是28ms

但是当我使用Release配置构建项目时,它在Compile Swift source files中停留了一个多小时。

我对此一无所知,请帮助我。

最佳答案

在 DEBUG 版本中,如果你把花在每个函数上的所有时间加起来,你会得到大约 7 秒。这些数字并没有完全相加——你已经花了 142 秒来构建整个东西,但这些函数只需要不到 7 秒的时间来编译??

那是因为这些时间只考虑了对每个函数体的类型检查。在Swift frontend您可以使用三个标志:

  1. -Xfrontend -debug-time-compilation
  2. -Xfrontend -debug-time-function-bodies
  3. -Xfrontend -debug-time-expression-type-checking

先用第一个看全貌。选择一个慢文件,说 Option.swift,然后看:

===-------------------------------------------------------------------------===
Swift compilation
===-------------------------------------------------------------------------===
Total Execution Time: 30.5169 seconds (43.6413 wall clock)

---User Time--- --System Time-- --User+System-- ---Wall Time--- --- Name ---
23.5183 ( 80.1%) 0.7773 ( 67.6%) 24.2957 ( 79.6%) 34.4762 ( 79.0%) LLVM output
3.7312 ( 12.7%) 0.0437 ( 3.8%) 3.7749 ( 12.4%) 5.4192 ( 12.4%) LLVM optimization
1.8563 ( 6.3%) 0.2830 ( 24.6%) 2.1393 ( 7.0%) 3.1800 ( 7.3%) IRGen
0.2026 ( 0.7%) 0.0376 ( 3.3%) 0.2402 ( 0.8%) 0.4666 ( 1.1%) Type checking / Semantic analysis
... <snip> ...
29.3665 (100.0%) 1.1504 (100.0%) 30.5169 (100.0%) 43.6413 (100.0%) Total

事实证明,慢的不是 Swift,而是 LLVM!所以看类型检查时间是没有意义的。我们可以使用 -Xllvm -time-passes 进一步检查为什么 LLVM 很慢,但它不会给我们有用的信息,它只是说 X86 Assembly/Object Emitter is taking大多数时间。

让我们退后一步,检查哪些文件编译时间最长:

Option.swift             30.5169
Toolbox.swift 15.6143
PictorialBarSerie.swift 12.2670
LineSerie.swift 8.9690
ScatterSerie.swift 8.5959
FunnelSerie.swift 8.3299
GaugeSerie.swift 8.2945
...

Options.swift 花费半分钟。这个文件有什么问题?

  1. 你有一个庞大的结构,有 31 个成员。单独编译该结构需要 11 秒。
  2. 您有一个巨大的枚举,有 80 个变体。单独编译这个枚举需要 7 秒。

第一个问题很容易解决:改用final class!第二个问题不会有一个简单的解决方法(我没有看到替代方案有任何时间改进例如,用类层次结构替换枚举)。所有其他慢文件都有类似的问题:大结构,大枚举。

只需将所有 struct 替换为 final class 就足以将编译时间从“超过几个小时仍在编译”缩短为“2.5 分钟”。


另见 Why Choose Struct Over Class? .您的“结构”可能不符合结构的条件。

请注意,从 struct 更改为类确实会改变用户代码的语义,因为类具有引用语义。

关于配置为 'release' 时 Swift 构建时间太长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43455325/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com