我有一个开源项目,项目中的文件计数器超过40个。
我在配置为Debug
且编译时间为2m22s
时构建项目。
我还使用BuildTimeAnalyzer,其中最长的时间是28ms
。
但是,当我使用Release
配置构建项目时,它会在Compile Swift source files
中停留超过一小时。
我对此一无所知,请帮助我。
答案 0 :(得分:2)
在DEBUG构建中,如果将所有花费在每个函数上的时间相加,那么大约需要7秒。这些数字并没有完全加起来 - 你花了142s来构建整个东西,但这些函数只需要7s来编译?
那是因为这些时间仅仅考虑了每个函数体的类型检查。在Swift frontend中,您可以使用三个标志:
-Xfrontend -debug-time-compilation
-Xfrontend -debug-time-function-bodies
-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
占用了大部分时间。
让我们退后一步,检查哪些文件需要花费大部分时间进行编译:
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
花了半分钟。这个文件出了什么问题?
第一个问题很容易解决:使用final class
代替!第二个问题不会有简单的修复(我没有看到任何时间改进替代品,例如替换枚举与类层次结构)。所有其他慢速文件都有类似的问题:大结构,大枚举。
简单地用struct
替换所有final class
就足以将编译时间从“超过几小时但仍在编译”变为“2.5分钟”。
另见Why Choose Struct Over Class?。您的“结构”可能不符合struct
s。
请注意,从struct
更改为类确实会更改用户代码的语义,因为类具有引用语义。
答案 1 :(得分:0)
试试这个....
在Build Settings
下 - &gt; Swift Compiler - Code Generation
Release
选择SWIFT_OPTIMIZATION_LEVEL = -Owholemodule
。然后在Other Swift Flags
下输入-Onone
。这样做可以减少我项目的大部分时间。