95 可读性
将光标移到/点击文章中的句子上,可以查看原文。 显示译文      显示原文      双语对照

swift编译时为什么这么慢?

我正在使用 Xcode 6测试版 6.

这是被窃听我有一段时间了,但达到一定程度,现在几乎没有可用的。

我的项目已经开始有体面大小 65 Swift 文件和一些弥合( 这并不是导致问题的原因) objc文件。

似乎对任何 Swift 文件( 就像在应用中添加一个简单的空白) 都有任何细微修改,将导致指定目标的整个 Swift 文件被重新编译。

更深入的调查后,我发现几乎 100%的编译器是什么时间是 CompileSwift 阶段xcode运行 swiftc 命令所有 Swift 文件你的目标。

我做了一些进一步的调查,如果我只让 App Delegate 默认控制器编译是非常快的,但当我添加越来越多的项目文件,编译时开始变得很慢。

现在只有 65个源文件。 每次编译需要大约 8/10 秒。 而不是 。

我没有看到任何帖子讨论这个问题除了但这是一个旧版本的xcode 6. 所以我想知道我是不是那个案例中唯一的一个。

更新

我有检查在github几 Swift 项目 Alamofire, 欧拉CryptoSwift但实际上没有一个人有足够的Swift 文件比较。 唯一的项目我发现开始有体面大小 SwiftHN,尽管它只有十几个源文件我还是能够验证同样的事情,一个简单的空间和整个项目需要重新编译开始( 2/3 秒) 花一点时间。

相比ObjC代码分析器和编译都是超快这真的感觉 Swift 将永远无法处理大型项目但请告诉我我错了。

我正在打开这个问题,因为我希望它能驱动更多的视图。

更新与xcode 6 β 7

仍然没有任何改进,这已经开始变得可笑了。 由于缺少 #import in Swift,我确实没有看到苹果将如何优化。

更新和xcode 6.3 Swift 1.2

最后英镑

苹果增加了增量构建 ( 以及许多其他编译器优化) 。 你必须将代码迁移到 Swift 1.2,以查看这些好处,但Apple在 XCode 6.3中添加了一个工具,帮助你完成以下任务:

enter image description here

英镑

不要像我那样高兴。 他们用来使构建增量的图形规划器还没有得到很好的优化。

事实上首先,如果你不看看函数签名变化添加一块空间的一个方法,根据这个类将会重新编译所有文件。

第二,它似乎创建了基于文件重新编译的树,即使更改不会影响它。 例如如果你将这 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 这里。

所以我希望他们能改进dependancy树求解器。 我已经用这个样例代码打开了一个雷达

时间: 原作者: 15个回答

结果是,Rob Napier是对的,它是一个单一的文件( 实际上一种方法),导致编译器去 berzek 。

现在不要误会, Swift 并重新编译所有文件每次但是现在,很棒的一件事是,苹果增加了实时编译反馈它编译的文件,所以xcode 6通用现在显示哪些 Swift 文件被编译和编译的状态实时正如你所看到的这张截图:

enter image description here

所以,很容易知道你的文件需要哪些时间。 在我的例子中,就是这一段代码:

var dic = super.json().mutableCopy() as NSMutableDictionary
dic.addEntriesFromDictionary([
"url" : self.url?.absoluteString??"",
"title" : self.title??""
 ])
return dic.copy() as NSDictionary

因为属性 titlevar title:String? 类型而不是 NSString,所以编译器在将它的添加到 NSMutableDictionary 时就会发疯。

将它的更改为:

var dic = super.json().mutableCopy() as NSMutableDictionary
dic.addEntriesFromDictionary([
"url" : self.url?.absoluteString??"",
"title" : NSString(string: self.title??"")
 ])
return dic.copy() as NSDictionary

使编译从 10/15 秒( 可能更多) 一直到一秒钟。 令人称奇。

罗勃,抱歉奖励宽限期结束了因为你是最值得的。 感谢你所有参与这里线程的人。

原作者:

很可能与你的项目规模无关。 可能是一些特定的代码,甚至只是一行代码。 你可以尝试一次编译一个文件,而不是整个项目。 或者尝试查看构建日志以查看哪个文件占用了这么长时间。

作为一个例子的代码,会引起麻烦,这 38 -line要点以beta7超过一分钟来编译。 所有它都是由这个块引起的:

let pipeResult =
seq |> filter~~ { $0 % 2 == 0 }
 |> sorted~~ { $1 <$0 }
 |> map~~ { $0.description }
 |> joinedWithCommas

只需一行或者两行就可以简化,它几乎可以立即编译。 问题是在编译器中导致了指数增长( 可能是阶乘增长) 。 显然这并不理想,如果你能隔离这种情况,你应该打开雷达来帮助解决这些问题。

原作者:

同时,请确保在编译调试( Swift或者 objective-c ) 时,你将只构建活动架构:

enter image description here

原作者:

需要注意的一点是,Swift 类型推理引擎的嵌套类型非常慢。 你可以知道是什么导致了缓慢通过观察单个编译单位,正在构建日志很长一段时间,然后复制&粘贴完整Xcode-spawned命令在一个终端窗口,然后打CTRL-得到诊断。 查看 http://blog.impathic.com/post/99647568844/debugging-slow-swift-compile-times的完整示例。

原作者:

因为所有这些都是测试版,而且Swift编译器是( 至少在今天) 没有打开,所以我猜你的问题没有真正的答案。

首先,比较 objective-c 与Swift编译器的比较。 Swift仍然处于测试版,我相信苹果在提供功能和修复 Bug 方面是工作的,而不仅仅是提供lightn的速度( 你不能通过购买家具来开始建造房子) 。 我想苹果会在到期时优化编译器。

如果出于某种原因,所有源文件都必须编译为 completey,那么一个选项可能是创建分离的模块/库。 但是这个选项还不可能,因为在语言稳定之前,Swift不能允许库。

我猜他们会优化编译器。 出于同样的原因,我们无法创建pre-compiled模块,很可能编译器需要从头开始编译所有内容。 但是一旦语言达到稳定的版本并且二进制程序'格式不再改变,我们将能够创建我们的库,并且) 也能优化它的工作。

只是猜测,尽管只有苹果知道。

原作者:

不幸的是,Swift 编译器还没有针对快速和增量编译( 在 Xcode 6.3测试版中) 进行优化。 同时,你可以使用以下一些技术来改进 Swift 编译时间:

  • 将应用程序分割为框架以减少重新编译影响。 但是请注意,你必须避免应用程序中的循环依赖。 有关这里主题的更多信息,请查看以下文章: http://bits.citrusbyte.com/improving-swift-compile-time/

  • 对你的项目部分使用 Swift,这些部分相当稳定且不经常更改。 其他地方你经常需要改变或区域,需要完成大量的编译/运行的迭代( 几乎任何用户界面相关的内容), 更好地利用 objective-c mix-and-match方法。

  • 尝试运行时代码注入,注入为 Xcode'

  • 使用roopc方法:http://roopc.net/posts/2014/speeding-up-swift-builds/

  • 通过给出显式类型转换的一些提示来释放 Swift 类型推理引擎。

原作者:

听全部我找到了我想的解决方案。 正在铸造。

我有大量的字典,像这样:

["title" :"someTitle","textFile" :"someTextFile"],
["title" :"someTitle","textFile" :"someTextFile"],
["title" :"someTitle","textFile" :"someTextFile"],
["title" :"someTitle","textFile" :"someTextFile"],
.....

编译它需要 40分钟。 直到我把字典变成这样:

["title" :"someTitle","textFile" :"someTextFile"] as [String : String],
["title" :"someTitle","textFile" :"someTextFile"] as [String : String],
["title" :"someTitle","textFile" :"someTextFile"] as [String : String],
....

这是为了几乎所有的问题我遇到的数据类型我的硬编码到我的应用

原作者:

Swift 编译时间在新的Xcode 6.3中得到了改进

编译器改进

Swift 1.2编译器被设计得更加稳定,并且可以提高性能。 在Xcode中使用 Swift 时,这些更改也提供了更好的体验。 一些最明显的改进包括:

增量构建

默认情况下没有更改的源文件将不再是 re-compiled,这将显著提高大多数常见情况的构建时间。 对代码的较大结构更改仍然需要重建多个文件。

快速可执行文件

调试生成生成运行速度相当快的二进制文件,新的优化提供更好的发布构建性能。

好的编译诊断工具

更清晰的错误和警告消息,以及新的Fix-its,使得编写正确的Swift 1.2代码更加容易。

稳定性改进

最常见的编译器崩溃已经被修复。 你还应该在Xcode编辑器中看到更少的SourceKit警告。

原作者:

快速数组和字典构造似乎是这个( 特别为来自 ruby 背景的用户提供)的流行原因,i.e.

var a = ["a":"b",
"c":"d",
"e":"f",
"g":"h",
"i":"j",
"k":"l",
"m":"n",
"o":"p",
"q":"r",
"s":"t",
"u":"v",
"x":"z"]

这可能是解决问题的原因:

var a = NSMutableDictionary()
a["a"] ="b"
a["c"] ="d"
... and so on
原作者:

在 xCode 6.3.1中没有什么用处- 当我添加 arround 100 Swift 文件时,xCode随机挂起构建和/或者索引。 我已经尝试了模块化选项,但没有成功。

实际工作对我来说是安装和使用xcode 6.4 β

原作者:
...