当配置“释放”时,Swift构建时间太长了?

时间:2017-04-17 16:24:49

标签: swift

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

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

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

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

2 个答案:

答案 0 :(得分:2)

在DEBUG构建中,如果将所有花费在每个函数上的时间相加,那么大约需要7秒。这些数字并没有完全加起来 - 你花了142s来构建整个东西,但这些函数只需要7s来编译?

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

  1. -Xfrontend -debug-time-compilation
  2. -Xfrontend -debug-time-function-bodies
  3. -Xfrontend -debug-time-expression-type-checking
  4. 让我们用第一个看到整个画面。选择一个慢速文件,例如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花了半分钟。这个文件出了什么问题?

    1. 你有一个巨大的结构,有31个成员。单独编译该结构需要11秒。
    2. 你有一个巨大的枚举,有80个变种。单独编译此枚举需要7秒钟。
    3. 第一个问题很容易解决:使用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。这样做可以减少我项目的大部分时间。