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

分享 |
swift编译时为什么这么慢?

60 0

我正在使用 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 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年08月05日 原作者: apouche

21 0

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

现在,不要误会我,Swift 每次重新编译你的文件,但伟大的事情是,苹果在编译的文件上添加了实时的编译反馈,因此,XCode 6通用的编译反馈和实时编译的状态如下图所示:

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 秒( 可能更多) 降低到一秒。。 amazing 。

罗勃,抱歉,奖励宽限期结束了因为你是那个deserved的。 感谢你参与这个线程。

发布时间: 15年08月05日 原作者: apouche
15 0

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

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


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


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

发布时间: 15年08月05日 原作者: Rob Napier
6 0

还要确保在编译调试( objective-c 或者) 时,你设置为只生成活动架构:

enter image description here

发布时间: 15年08月05日 原作者: Rivera
5 0

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

发布时间: 15年08月05日 原作者: mprudhom
4 0

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

首先,将 objective-c 与编译器进行比较是非常残忍的。 还在测试中,Iamsure公司正在努力提供功能和修复 Bug,而不仅仅是提供闪电速度( 你不'开始购买家具。 我想苹果会在到期时优化编译器。

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

我猜想他们将优化编译器。 由于我们无法创建预先编译的模块,所以编译器需要从头开始编译所有内容。 但是一旦语言达到稳定的版本并且二进制文件'格式不再改变,我们将能够创建我们的库,并且) 也将能够优化它的工作。

只是猜测,虽然只有苹果知道。。

发布时间: 15年08月05日 原作者: george
4 0

不幸的是,Swift 编译器仍然没有针对快速和增量编译( 从Xcode开始) 进行优化。 同时,你可以使用以下一些技术来改进 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 类型推理引擎。

发布时间: 15年08月05日 原作者: vorterixe
24 12

听着我找到了我想的解决方案。 铸造。

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


["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],
....


这几乎适用于我遇到的关于数据类型的其他问题,我硬编码到应用程序中

发布时间: 15年08月05日 原作者: YichenBman
1 0

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

编译器改进

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

增量构建

默认情况下,没有更改的源文件将不再被编译,这将极大地改善大多数常见案例的构建时间。 对代码的较大结构更改可能仍然需要重新生成多个文件。

可以执行的可执行文件数为

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

更好的编译器诊断工具

更清晰的错误和警告消息,以及新的修复,使编写正确的Swift 1.2代码更容易。

稳定性改进

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

发布时间: 15年08月05日 原作者: Vojtech Vrbka
1 0

数组和字典构造似乎是这个( 特别为你来自 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


发布时间: 15年08月05日 原作者: Marcelo Ribeiro
0 0

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

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

发布时间: 15年08月05日 原作者: hris.to
...