自从Swift 3和XCode8以来,我的项目编译速度非常慢。 每次我添加一个空行到文件,重新编译需要一整分钟。当我检查输出时,没有特定的文件需要很长时间。 (我也用这个工具来测量它:https://github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode)
似乎总是一次编译4个文件。 “节奏”非常稳定。只是很慢......
另外:每当我打开或切换文件时,可能需要很长时间才能获得自动完成或错误/警告。
我可以查看哪些内容?我几乎觉得我设置了一些标志,只是像疯了一样拖慢构建速度..
修改 这不是底层问题的解决方案,但我花了一些时间将更多代码转移到框架。这产生了不同(仅仅因为它每次都必须重新编译更少的文件)。这不应该是必要的,但它无法忍受......我当然还在寻找一个合适的解决方案。
答案 0 :(得分:26)
这个问题的一个问题是我们不知道错误的初始化/声明在哪里。我的同事建议的解决方案是找到哪个函数需要很长时间才能编译:
Project
选择目标Build Settings
- > Swift Compiler - Custom Flags
Other Swift Flags
-Xfrontend -warn-long-function-bodies=50
(50代表时间,以毫秒为单位)之后,警告应显示如下:
Getter' frameDescription'花了108ms进行型式检查(限制:50ms)
之后你知道该怎么做;)
答案 1 :(得分:5)
自从升级到Swift 3 / XCode 8后我才遇到同样的问题,它似乎是由大数组文字引起的,类似于this。
我能够通过向分配给数组文字的变量添加类型注释来解决问题,例如。
let array: Array<String> = ["1", "2", "3", "4", "5", "6", "7", "8"]
而不是
let array = ["1", "2", "3", "4", "5", "6", "7", "8"]
答案 2 :(得分:5)
这是Xcode 8的一个问题,它不能正确执行增量构建。如果您编辑单个swift文件,它应该只编译该文件。这已在此处提出:Xcode 8 does full project rebuild
一次建立4个文件听起来像Xcode正在执行项目的完全重建,如果你只修改了一个文件中的一行,就不应再发生了。
答案 3 :(得分:3)
在我的情况下,我使用辅助函数在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
}
答案 4 :(得分:1)
这对我的一个项目有用。
转到产品 - &gt;方案 - &gt;编辑方案。在左侧选择Build 列并取消选中“查找隐式依赖项”但此标志应该 在第一次构建项目时保持检查..
这是一个简单的项目,它将我的一个版本从1分钟增加到2秒。
在物理设备上我得到了这些结果。 对于我的一个较大的项目(42个文件),它从2:36减少到2:20。 然后我补充说: SWIFT_WHOLE_MODULE_OPTIMIZATION = YES将“设置”设置为用户定义的设置。 时间下降到 - 2:00
在模拟器上,我第一次使用构建时间为49秒。
转到产品 - &gt;方案 - &gt;编辑方案。在左侧选择Build 列并取消选中“查找隐式依赖项”但此标志应该 在第一次构建项目时保持检查..
并且构建需要7秒钟。
我希望这会有所帮助。
答案 5 :(得分:1)
通过避免使用Nil-Coalescing Operator和字符串连接,我能够大大减少我快速的项目编译时间。
在其他地方,我有类似的东西:
let x = "one" + object.nullableProperty ?? ""
我把它改成了
let x = String(format: "one %@", object.nullableProperty ?? "")
我的编译时间大幅下降 - 从20分钟降至20秒。
答案 6 :(得分:0)
确保您没有合并let combinedArrays = array1 + array2
这样的数组。这里有类型推断的已知错误,其中Swift浪费时间试图找出combinedArrays
应该是什么类型。相反,[array1, array2].joined()
应该也可以正常工作,编译得更快。
答案 7 :(得分:0)
减慢编译时间的一种常见做法是使用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文件。