Xcode 10 iOS应用程序构建,“隐藏”任务花费了大部分构建时间

问题描述 投票:3回答:1

更改一行代码并在大型项目中执行Xcode 10.1增量构建后,Xcode在完成所有列出的任务(编译更改的文件和合并swiftmodule均已完成)之后,将大部分构建时间花费在“编译swift源文件”阶段。屏幕快照,显示任务列表:https://imgur.com/a/JoVI0zB

虽然编译和合并swift模块花费不到一秒钟,但在我的项目中,整个阶段最多可能需要2分钟(300k LOC)。

这次Xcode做什么?有什么方法可以加快这个过程吗?

用Obj-C编写的类似项目在更改1行代码后只需几秒钟即可启动。

swift xcode build xcode10
1个回答
0
投票

我也有同样的问题,经过大量调查,我确定它所做的一切都是基于您拥有的快速源文件数

根本原因

演示者在2018 wwdc talk about the Xcode build system中说(可以在视频的抄本中搜索:)>

这意味着与Clang不同,当编译一个Swift文件时,编译器将解析目标中的所有其他Swift文件。

因此,即使/尽管增量构建仅需要重新编译single

文件,它仍会解析every other swift文件。

我们的项目有2000多个快速的源文件,对于重新编译一个独立的文件,我们看到3分钟以上的增量编译时间。

测试以证明根本原因

由于在WWDC演讲中听不清,所以我自己做了以下测试:

  1. 创建一个新项目
  2. 测试几乎为空的项目的增量生成时间,更改单个文件
    • 增量构建几乎立即完成(<1-2秒)
  3. 使用脚本生成2,000个swift文件,每个文件包含一个具有唯一名称,2个变量和一个简单函数的简单结构。任何文件之间都没有依赖关系。
  4. 将包含2,000个新swift文件的目录添加到项目中,并完成完整的构建。
  5. 再次测试单个文件的增量生成时间
    • 增量构建时间花费了超过1分钟
  6. 在我的测试中,其他快速文件内容的复杂性似乎并不重要,而只是文件数量。

解决方案-模块化/框架

将您的应用程序分成较小的框架,以减少每个目标中快速源文件的数量。

[This is a decent guide显示了有关如何执行此操作的步骤,如果您还不知道如何。

在上面的测试案例中,我创建了一个新框架并将2,000个swift文件移入该框架,然后在原始项目(导入框架)中测试了递增的构建时间,并且构建时间回到了1-2秒。当然,在框架内进行增量构建仍然会很慢,但是理想情况下,您可以将项目拆分为许多较小的框架,以便每个框架都有更快的增量构建时间。

不是解决方案-合并文件

如果问题是文件数量,为什么不合并一堆文件以减少数量?因为这可能会导致增量构建速度变慢。

根据2018 WWDC's Building Faster in Xcode

Swift的依赖关系模型基于文件

这与我们当前的问题有关,因为这意味着对文件的任何更改(仅对函数主体内容的更改除外)都将导致依赖于更改后文件中任何内容的任何文件的重新编译。

如果将多种类型合并到一个文件中,则任何更改都会影响大文件或其任何依赖项,这将导致更多代码在增量版本上重新编译。如果修改了大文件中的任何类型,它也将增加大文件所具有的依赖性,因此所有文件都将重新编译。

© www.soinside.com 2019 - 2024. All rights reserved.