XCode 8非常慢的快速编译

时间:2016-10-05 17:09:24

标签: ios swift xcode swift3 xcode8

自从Swift 3和XCode8以来,我的项目编译速度非常慢。 每次我添加一个空行到文件,重新编译需要一整分钟。当我检查输出时,没有特定的文件需要很长时间。 (我也用这个工具来测量它:https://github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode

似乎总是一次编译4个文件。 “节奏”非常稳定。只是很慢......

另外:每当我打开或切换文件时,可能需要很长时间才能获得自动完成或错误/警告。

我可以查看哪些内容?我几乎觉得我设置了一些标志,只是像疯了一样拖慢构建速度..

修改 这不是底层问题的解决方案,但我花了一些时间将更多代码转移到框架。这产生了不同(仅仅因为它每次都必须重新编译更少的文件)。这不应该是必要的,但它无法忍受......我当然还在寻找一个合适的解决方案。

8 个答案:

答案 0 :(得分:26)

这个问题的一个问题是我们不知道错误的初始化/声明在哪里。我的同事建议的解决方案是找到哪个函数需要很长时间才能编译:

  1. 转到Project选择目标
  2. Build Settings - > Swift Compiler - Custom Flags
  3. 添加到Other Swift Flags -Xfrontend -warn-long-function-bodies=50(50代表时间,以毫秒为单位)
  4. 之后,警告应显示如下:

      

    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   列并取消选中“查找隐式依赖项”但此标志应该   在第一次构建项目时保持检查..

Source

这是一个简单的项目,它将我的一个版本从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.appendString.append(或其+运算符等效项)。对于String,最好使用格式化字符串,而不是

let hello = "Hello, "
let world = "World!"
let combinedString = hello + world

你应该使用

let combinedString = "\(hello)\(world)"

我无法记住确切的加速比,但对于那些特定的线路,它大约是10次。可以想象,除了最重要的项目之外,这种情况不会有明显的加速。例如,我们的项目有数百个的Swift文件,以及许多Objective-C文件,我们的编译时间通常是10分钟或更长时间,有时即使是唯一的变化是非Swift文件