[英]Xcode 8 very slow Swift compiling
自从Swift 3和Xcode 8以来,我的项目编译速度非常慢。 每次我添加一个空行到文件,重新编译需要一整分钟。 当我检查输出时,没有特定的文件需要很长时间。 (我也用这个工具测量它: https : //github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode )
它似乎总是一次编译4个文件。 “节奏”非常稳定。 只是很慢......
另外:每当我打开或切换文件时,可能需要很长时间才能获得自动完成或错误/警告。
我可以检查什么? 我几乎觉得我设置了一些标志,只是像疯了一样拖慢构建速度。
编辑:这不是解决潜在问题的方法,但我花了一些时间将更多代码转移到框架上。 这产生了不同(仅仅因为它每次都必须重新编译更少的文件)。 这不应该是必要的,但它无法忍受......我当然仍然非常期待一个正确的解决方案。
这个问题的一个问题是我们不知道错误的初始化/声明在哪里。 我的同事建议的解决方案是找到哪个函数需要很长时间才能编译:
Project
选择目标 Build Settings
- > Swift Compiler - Custom Flags
Other Swift Flags
-Xfrontend -warn-long-function-bodies=50
(50表示以毫秒为单位的时间) 之后,警告应显示如下:
Getter'frameDescription'花了108ms进行类型检查(限制:50ms)
之后你知道该怎么做;)
自从升级到Swift 3 / XCode 8以来,我遇到了同样的问题,它似乎是由大数组文字引起的,类似于此 。
我能够通过向分配给数组文字的变量添加类型注释来解决问题,例如
let array: Array<String> = ["1", "2", "3", "4", "5", "6", "7", "8"]
代替
let array = ["1", "2", "3", "4", "5", "6", "7", "8"]
这是Xcode 8的一个问题,它不能正确执行增量构建。 如果您编辑单个swift文件,它应该只编译该文件。 这已经在这里提出: Xcode 8完成了完整的项目重建
一次4个文件构建听起来像Xcode正在执行项目的完全重建,如果您只在一个文件中修改了一行,则不应该再次发生。
在我的情况下,我使用辅助函数来保存Firebase中的一些数据。 该函数返回一个包含大约20个元素的字典,编译大约需要40分钟。 我的解决方案是初始化一个空字典,然后将这些项逐个添加到someDict
。 现在它在不到30秒的时间内编译。 我希望它有所帮助。
之前
func toAnyObject() -> AnyObject {
return
["BookingAmount":BookingAmount,
"BookingNumber":BookingNumber,
"PostCode":PostCode,
"SelectedBathRow":SelectedBathRow,
"SelectedBedRow":SelectedBedRow,
"DateAndTime":DateAndTime,
"TimeStampDateAndTime":TimeStampDateAndTime,
"TimeStampBookingSavedInDB": TimeStampBookingSavedInDB,
"FrequencyName":FrequencyName,
"FrequecyAmount":FrequecyAmount,
"insideCabinets": insideCabinets,
"insideFridge": insideFridge,
"insideOven": insideOven,
"laundryWash": laundryWash,
"interiorWindows": interiorWindows,
"FullName":FullName,
"SuppliesName":SuppliesName,
"SuppliesAmount":SuppliesAmount,
"FlatNumber":FlatNumber,
"StreetAddress":StreetAddress,
"PhoneNumber":PhoneNumber,
"EmailAddress":EmailAddress] as AnyObject
}
后
func toAnyObject() -> AnyObject {
var someDict = [String : AnyObject]()
someDict["BookingAmount"] = self.BookingAmount as AnyObject?
someDict["BookingNumber"] = self.BookingNumber as AnyObject?
someDict["PostCode"] = self.PostCode as AnyObject?
someDict["SelectedBathRow"] = self.SelectedBathRow as AnyObject?
someDict["SelectedBedRow"] = self.SelectedBedRow as AnyObject?
someDict["DateAndTime"] = self.DateAndTime as AnyObject?
someDict["TimeStampDateAndTime"] = self.TimeStampDateAndTime as AnyObject?
someDict["TimeStampBookingSavedInDB"] = self.TimeStampBookingSavedInDB as AnyObject?
someDict["FrequencyName"] = self.FrequencyName as AnyObject?
someDict["FrequecyAmount"] = self.FrequecyAmount as AnyObject?
someDict["insideCabinets"] = self.insideCabinets as AnyObject?
someDict["insideFridge"] = self.insideFridge as AnyObject?
someDict["insideOven"] = self.insideOven as AnyObject?
someDict["laundryWash"] = self.laundryWash as AnyObject?
someDict["interiorWindows"] = self.interiorWindows as AnyObject?
someDict["FullName"] = self.FullName as AnyObject?
someDict["SuppliesName"] = self.SuppliesName as AnyObject?
someDict["SuppliesAmount"] = self.SuppliesAmount as AnyObject?
someDict["FlatNumber"] = self.FlatNumber as AnyObject?
someDict["StreetAddress"] = self.StreetAddress as AnyObject?
someDict["PhoneNumber"] = self.PhoneNumber as AnyObject?
someDict["EmailAddress"] = self.EmailAddress as AnyObject?
return someDict as AnyObject
}
这对我的一个项目有用。
转到产品 - >方案 - >编辑方案。 在左侧列中选择Build并取消选中“Find implicit dependencies”但是在第一次构建项目时应保持选中此标志。
这是一个简单的项目,它将我的一个版本从1分钟增加到2秒。
在物理设备上我得到了这些结果。 对于我的一个较大的项目(42个文件),它从2:36减少到2:20。 然后我添加了:SWIFT_WHOLE_MODULE_OPTIMIZATION = YES将Build Settings设置为用户定义的设置。 时间下降到凌晨2点
在模拟器上,我使用的第一次构建是49秒。
转到产品 - >方案 - >编辑方案。 在左侧列中选择Build并取消选中“Find implicit dependencies”但是在第一次构建项目时应保持选中此标志。
并且构建需要7秒。
我希望这有帮助。
通过避免使用Nil-Coalescing运算符和字符串连接,我能够大大减少我快速的项目编译时间。
在其他地方我有类似的东西:
let x = "one" + object.nullableProperty ?? ""
我改成了
let x = String(format: "one %@", object.nullableProperty ?? "")
我的编译时间大幅下降 - 从20分钟到20秒。
确保你没有像let combinedArrays = array1 + array2
那样组合数组。 这里有类型推断的已知错误,其中Swift浪费时间试图找出combinedArrays
应该是什么类型。 相反, [array1, array2].joined()
应该也可以正常工作,编译得更快。
减慢编译时间的一种常见做法是使用Array.append
和String.append
(或它们的+
运算符等价物)。 对于String
,最好使用格式化的字符串,而不是
let hello = "Hello, "
let world = "World!"
let combinedString = hello + world
你应该使用
let combinedString = "\(hello)\(world)"
我不记得确切的加速,但对于那些特定的线,它大约是10次。 可以想象,除了最重要的项目之外,这种情况不会有明显的加速。 例如,我们的项目有数百个 Swift文件,以及许多Objective-C文件,我们的编译时间通常是10分钟或更长时间, 有时甚至是唯一的更改是非Swift文件 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.