【问题标题】:Dramatically long Swift compilation time超长的 Swift 编译时间
【发布时间】:2017-05-25 21:54:45
【问题描述】:

我喜欢Apple 和他们所做的事情,但是Swift... 天哪!

我的 `Swift` 编译时间有问题。

配置:

  • MacBook Pro(视网膜显示屏,13 英寸,2014 年中)
  • 2.6 GHz 英特尔酷睿 i5
  • 8 GB 1600 MHz DDR3
  • SSD 256(最高 800 MB/s)
  • 1k 类
  • 10 个豆荚

编译时间: 3 分钟。

看起来像“new best and Amazing swift, the dream”这个配置是不够的,它像Google Chrome - InfiniteLoop(find free memory - eat)一样工作


我尝试了各种方法来加快编译时间:

  • HEADERMAP_USES_VFS 设置为YES(不变)

  • 设置Build Settings / Architectures / Build Active Architecture OnlyYES(一些改进)

  • 设置defaults write com.apple.Xcode PBXNumberOfParallelBuildSubtasks 4 (8) (有时会变得更糟)

  • 将优化级别设置为-Onone(无重大改进)

  • 设置调试信息格式 - DWARF 而不是 DWARF with dSYM File

  • 从您的方案中禁用Find implicit dependencies(无重大 改进)

  • 创建了一个新项目并将所有文件移至新项目(耗时太长,时间改进很小)

  • 编译器从默认更改为其他可用(甚至更糟)

  • 关于如何编写快速编译的 Swift 代码的严格规则(详情如下)

我发现一些帖子描述了同样的问题:herehere

我猜每个人都在等待新的Xcode 8.2 beta 2 哪里:

Xcode 在很小的时候不会重建整个目标 发生了变化。 (28892475)

但这只是部分正确,我的编译时间仍然很长 - 从 6-12 分钟变为 3-8 分钟。对此的详细说明可以查看herehere

另外,我在编写代码时遵循了所有这些规则:

  • 链式函数缩减
  • 解开选项
  • 对象的隐式类型(尤其是字典)
  • 避免??接线员(这个非常饿!!)
  • 避免 ?: 运算符

换句话说,不要使用任何“新酷功能”,因为你会等待很长时间。

再试一次 - 是here 描述的解决方法:

转到产品 -> 方案 -> 编辑方案。选择左侧构建 列并取消选中“查找隐式依赖项”但是这个标志应该 首次构建项目时保持选中状态。

但是,这种解决方法不是我想要的,这也可以作为临时解决方案。

Swift 很痛苦,不是因为它难以编写,而是因为它很难使用(至少在某些机器上是这样)。

为了比较:我在Objective-C 上有一个项目,有 2k 个类和 11 个 pod - 干净的编译时间约为 30 秒。

我还发现了很多关于 swift 性能的已打开错误:

我的问题是:

有没有人有任何改善 Swift 编译时间的解决方案?

【问题讨论】:

  • 我认为这只是在具有许多特性的更高级语言中所固有的,obj-c 与 swift 相比非常基础,因此编译器需要做的工作要少得多才能将代码转换为二进制形式,我认为如果您也使用 obj-c 桥接,它将为您的 swift 项目增加大量编译时间
  • 我认为它是一种年轻的语言,在编译器中存在许多错误。任何使用它的人都应该准备好面对这些错误。我想你可以等待新版本的编译器,也许那里的错误会被修复。
  • 我注意到对类型的公共/开放部分的更改通常会触发重新编译的“连锁反应”。因此,保持公共部分尽可能稳定并仔细设置 private/fileprivate 是有意义的。甚至可能在实现和接口之间使用某种桥梁。
  • 我们在编译时也有同样的问题。我们将项目分解为目标,并将文件移动到新目标。以这种方式重构项目需要花费大量时间,但值得。整个项目编译 10 分钟,应用目标编译发生任何变化后需要 1 分钟。

标签: ios swift xcode time compilation


【解决方案1】:

无调试限制的全模块优化

只需将 SWIFT_WHOLE_MODULE_OPTIMIZATION 添加为 user-defined 设置,其值为 YES,您的编译时间应该会大大缩短。

此修复由 Zalando 的开发人员引入。向他们大声喊叫。 https://jobs.zalando.com/tech/blog/improving-swift-compilation-times-from-12-to-2-minutes/?gh_src=4n3gxh1

【讨论】:

  • 在这种情况下,在调试模式下,由于优化级别,您无法检查任何变量的值,不是吗?
  • 不,这不是真的。我们正在激活不带 o 标志的整个模块优化,因此调试按预期工作。
【解决方案2】:

通过使用 Carthage 而不是 Cocoapods 来包含第三方库,我们大大缩短了编译时间。

【讨论】:

    【解决方案3】:

    这个问题对我来说也非常 令人沮丧。我们已经尝试了您提到的几种解决方案,但都没有奏效。

    编译时间显着改善的一件事是: 在Other Swift Flags 中添加-Onone 时打开Whole Module Optimization
    看到这个 - Speed Up Swift Compilation

    我正在使用 Swift 3Xcode 8.3

    【讨论】:

    • 感谢提供的解决方案将我的构建时间从 25 分钟缩短到 11 分钟
    【解决方案4】:

    您可能已启用代码优化,虽然这是构建发布版本的必要条件,但对于开发版本而言,这并不是特别重要。

    代码优化的作用正是它所说的,它优化您的代码以使生成的最终二进制文件更小。它会做一些事情,例如将变量/方法重命名为单个字符等......就像我说的那样,您在提交到应用商店时显然想要这个,但您可能不在乎应用程序在开发时是否更大。

    您可以通过转到项目设置 > 构建设置,在 Swift 编译器 - 代码生成将优化级别设置为无 [-Onone] 下的“优化”来关闭开发构建的代码优化。

    这应该会显着缩短您的构建时间。

    【讨论】:

    • 它已经设置为-Onone - 在帖子中添加更新,但即使这样我也必须在每次构建后等待几分钟
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    • 2022-11-14
    • 2021-09-09
    相关资源
    最近更新 更多