我正在使用 Xcode 6 Beta 6。
这是困扰我一段时间的事情,但它已经到了现在几乎无法使用的地步。
我的项目开始有65 个Swift文件和一些桥接的 Objective-C 文件(这真的不是问题的原因)。
似乎对任何 Swift 文件的任何轻微修改(例如在应用程序中几乎不使用的类中添加一个简单的空格)都会导致指定目标的整个 Swift 文件被重新编译。
经过更深入的调查,我发现几乎 100% 的编译器时间是CompileSwift
Xcode 在swiftc
目标的所有 Swift 文件上运行命令的阶段。
我做了一些进一步的调查,如果我只使用默认控制器保留应用程序委托,编译速度非常快,但是随着我添加越来越多的项目文件,编译时间开始变得非常慢。
现在只有 65 个源文件,每次编译大约需要 8/10 秒。一点也不快。
除了这个,我没有看到任何关于这个问题的帖子,但它是 Xcode 6 的旧版本。所以我想知道我是否是唯一一个在这种情况下。
更新
我在GitHub 上查看了一些 Swift 项目,例如Alamofire、Euler和CryptoSwift,但没有一个项目有足够的 Swift 文件来进行实际比较。我发现的唯一一个大小合适的项目是SwiftHN ,即使它只有十几个源文件,我仍然能够验证相同的东西,一个简单的空间,整个项目需要重新编译,这开始需要很少的时间(2/3 秒)。
与分析器和编译速度都非常快的 Objective-C 代码相比,这真的感觉 Swift 永远无法处理大型项目,但请告诉我我错了。
更新 Xcode 6 Beta 7
仍然没有任何改善。这开始变得荒谬了。由于缺乏#import
Swift,我真的不知道 Apple 将如何优化这一点。
更新 Xcode 6.3 和 Swift 1.2
Apple 添加了增量构建(以及许多其他编译器优化)。您必须将代码迁移到 Swift 1.2 才能看到这些好处,但 Apple 在 Xcode 6.3 中添加了一个工具来帮助您这样做:
然而
不要像我一样高兴得太快。他们用来进行增量构建的图形求解器还没有得到很好的优化。
实际上,首先,它不查看函数签名更改,因此如果您在一个方法的块中添加一个空格,则依赖于该类的所有文件都将被重新编译。
其次,它似乎是根据重新编译的文件创建树,即使更改不会影响它们。例如,如果将这三个类移动到不同的文件中
class FileA: NSObject {
var foo:String?
}
class FileB: NSObject {
var bar:FileA?
}
class FileC: NSObject {
var baz:FileB?
}
现在如果你修改FileA
,编译器显然会标记FileA
为重新编译。它也会重新编译FileB
(根据对 的更改,这将是可以的FileA
),但也FileC
因为FileB
被重新编译,这非常糟糕,因为FileC
从不FileA
在这里使用。
所以我希望他们改进依赖树求解器......我已经用这个示例代码打开了一个雷达。
更新 Xcode 7 beta 5 和 Swift 2.0
昨天 Apple 发布了 beta 5,在发行说明中我们可以看到:
Swift 语言和编译器 • 增量构建:仅更改函数体不应再导致依赖文件重新构建。(15352929)
我已经尝试过了,我必须说它现在真的(真的!)运作良好。他们极大地优化了 swift 中的增量构建。
我强烈建议您创建一个swift2.0
分支并使用 XCode 7 beta 5 使您的代码保持最新。您会对编译器的增强感到高兴(但是我会说 XCode 7 的全局状态仍然很慢且有问题)
使用 Xcode 8.2 更新
自从我上次更新这个问题以来已经有一段时间了,所以在这里。
我们的应用程序现在大约有 20k 行几乎完全是 Swift 代码,这很不错,但并不出色。它经历了 swift 2 和 swift 3 迁移。在 2014 年中期的 Macbook pro(2.5 GHz Intel Core i7)上编译大约需要 5/6m,这在干净的构建上是可以的。
然而,尽管 Apple 声称,增量构建仍然是一个笑话:
当仅发生很小的更改时,Xcode 不会重建整个目标。(28892475)
显然,我认为我们中的许多人在检查完这些废话后只是笑了(向我的项目的任何文件添加一个私有(私有!)属性将重新编译整个事情......)
我想向你们指出苹果开发者论坛上的这个帖子,其中包含有关该问题的更多信息(以及不时感谢苹果开发者就此事进行的交流)
基本上人们已经想出了一些东西来尝试改进增量构建:
- 添加
HEADER_MAP_USES_VFS
项目设置集true
Find implicit dependencies
从您的方案中禁用- 创建一个新项目并将文件层次结构移动到新项目。
我会尝试解决方案 3,但解决方案 1/2 对我们不起作用。
在整个情况下具有讽刺意味的是,在查看有关此问题的第一篇文章时,我们使用 Xcode 6 和我相信 swift 1 或 swift 1.1 代码,当我们达到第一次编译时,现在大约两年后,尽管 Apple 进行了实际改进情况和 Xcode 6 一样糟糕。多么讽刺。
实际上,我真的很后悔为我们的项目选择 Swift 而不是 Obj/C,因为它每天都会带来挫败感。(我什至切换到 AppCode 但这是另一回事)
无论如何,我看到这篇 SO 帖子在撰写本文时有 32k+ 的浏览量和 143 次浏览量,所以我想我不是唯一一个。尽管对这种情况持悲观态度,但坚持下去,隧道尽头可能会有一些曙光。
如果你有时间(和勇气!),我猜 Apple 对此表示欢迎。
直到下次!干杯
使用 Xcode 9 更新
今天偶然发现了这个。Xcode 悄悄地引入了一个新的构建系统来改进当前糟糕的性能。您必须通过工作区设置启用它。
已经尝试过了,但完成后会更新这篇文章。不过看起来很有希望。