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

分享 |
swift编译时为什么这么慢?
Why is swift compile time so slow?

60 0

我正在使用Xcode 6 Beta 6.

这是我一直困扰着我的事情,但它已经到达了一个几乎无法使用的地方。

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

对swift文件的任何细微修改( 比如在应用程序中添加一个简单的空白) 将导致整个swift文件被重新编译为指定目标的整个swift文件。

分享你的所有swift文件target,在深入的调查之后,我发现怎么几乎 100% 编译器的时间是在xcode运行swiftc CompileSwift 阶段逐渐改进。

我做了一些进一步的调查,如果我只保留app delegate,默认的控制器是一个非常快的编译器,但是编译时的工作量会非常大,编译时间会变得非常缓慢。

现在只有 65 个源文件。 大约8/10秒每次都要编译。 不是非常的快速根本。

那case,里我没有看到任何文章时提到这个问题除了这个 - 那是个老版本的Xcode 6.所以我在想如果我是只有一个。

更新

我已经在github上检查过一些swift项目,比如 AlamofireEulerCryptoSwift,但是它们没有足够的swift文件来真正地比较它们。 我发现唯一的工程开始了一个有不错尺寸 SwiftHN,即使它只有12个我还能够验证同样的事情,一个简单的源文件需要重新编译整个项目,开始花点时间和空间( 2/3 秒) 。

ObjC代码相比,这两个分析器和编译速度都非常快,这真的感觉swift永远都无法处理大型项目但是请告诉我,我。

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

更新使用Xcode 6 Beta 7

还是没有任何改善。 这开始变得可笑了。 由于swift中缺少#import,我真的不知道苹果如何能够优化这个。

使用XCode 6.3 和Swift 1. 2 更新

最后

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

enter image description here

然而

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

实际上,它不查看函数签名的变化,因此如果在一个方法的块中添加空格,那么所有依赖于该类的文件都将重新编译。

其次,它似乎创建了基于文件的树,即使更改不影响它们。 例如,如果将这 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 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秒( 可能更多) 到一秒。 Amazing 。

rob抱歉恭喜你的奖励宽限期因为你是那个最值得的。 感谢你参与这个线程。

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

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

例如,可能会导致麻烦的代码的类型,gist 38-line gist takes beta7 compile编译的代码需要一分钟以上。 所有这些都是由这个块引起的:


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


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

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

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

enter image description here

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

需要注意的一点是,Swift类型推理引擎在嵌套类型上可能非常慢。 你可以大致了解关于是什么导致这一问题通过观看生成日志为单个编译单元都需要很长时间,然后复制命令到终端窗口然后打CTRL-\ &粘贴完整的xcode繁殖来得到一些诊断。 查看 http://blog.impathic.com/post/99647568844/debugging-slow-swift-compile-times 以获得完整的示例。

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

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

首先,比较 objective-c 到Swift编译器是有些残忍的。 Swift仍然在beta中,我相信苹果正在提供功能和修复bug,不仅仅是提供闪电速度( 你不开始购买家具) 。 我想苹果会在到期时优化编译器。

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

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

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

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

不幸的是,Swift编译器仍然没有针对快速编译和增量编译而优化( 如Xcode 6.3 beta ) 。 同时,你可以使用以下一些技术来改进快速编译时间:

  • 将应用程序拆分为框架以减少重新编译的影响。 但是要注意,你必须避免在应用程序中使用循环依赖。 要进一步了解本主题的信息,请查看以下文章: http://bits.citrusbyte.com/improving-swift-compile-time/

  • 在你的项目部分使用Swift,这些部分非常稳定,而且不经常变化。 对于需要经常更改的其他区域或需要大量编译 objective-c 运行迭代的区域( 几乎任何UI相关的内容),最好使用mix-and-match方法。

  • 尝试使用'注入运行时代码注入,用于Xcode''

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

  • 通过给出一些提示,并显式地显示一些提示,从而减轻swift类型推理引擎。

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

全部收听 ! 我找到了我认为。 铸造。

我有一大堆字典,如下所示:


["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

快速编译时间在新的Xcode 6. 3 中得到改进

编译器改进

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

增量生成

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

更快的可执行文件

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

更好的编译器诊断

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

稳定性改进

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

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

Swift数组和字典结构似乎是一个非常流行的原因( 特别是对于来自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.中没有什么用处- 当我添加arround 1 swift文件时xCode随机挂起生成和或索引。 我尝试了模块化选项,但没有成功。

对我来说是使用xCode就可以工作 6.4 Beta 安装和。

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