Xcode 编译时间非常慢

Xcode 编译时间非常慢,xcode,swift3,Xcode,Swift3,我的项目由大约350个Swift文件和大约40个cocoa pod依赖项组成 整个项目一迁移到Swift 3,构建时间就变得异常缓慢,需要3分钟多一点的时间才能完成编译。 我注意到,如果我在不更改任何文件后重建,它将在合理的时间内构建。但是,如果我添加一个新函数,则需要3分钟以上的时间。 Cocoapods似乎没有引起问题,因为它延迟了编译Swift源文件的时间 我跟踪调查: 将-Xfrontend-debug time函数体标志添加到我的目标构建设置中的我的其他Swift标志 建设项目 将

我的项目由大约350个Swift文件和大约40个cocoa pod依赖项组成

整个项目一迁移到
Swift 3
,构建时间就变得异常缓慢,需要3分钟多一点的时间才能完成编译。
我注意到,如果我在不更改任何文件后重建,它将在合理的时间内构建。但是,如果我添加一个新函数,则需要3分钟以上的时间。
Cocoapods似乎没有引起问题,因为它延迟了
编译Swift源文件的时间

我跟踪调查:

  • -Xfrontend-debug time函数体
    标志添加到我的目标构建设置中的我的
    其他Swift标志

  • 建设项目

  • 将其复制到终端并运行
    pbpaste | egrep'\.[0-9]ms'| sort-t'.-k1-n | tail-100

  • 然而,我没有看到任何令人担忧的事情。编译时间最长的文件只有250ms。第二个最接近的是100毫秒,即使所有350个文件都需要250毫秒来编译,那也只需要73秒,这与我所看到的3分钟以上的构建时间相去甚远


    是什么导致编译时间过长? 在更新到
    Xcode 8
    Swift 3

    更新1: 我创建了一个新项目,没有运行
    Swift 3
    转换,导入了
    Swift 3
    文件,但构建时间保持不变

    更新2: 我已经尝试了
    SWIFT\u WHOLE\u MODULE\u OPTIMIZATION=YES
    ,但一旦您对多个文件进行更改,增量构建就会失败,并触发持续4-5分钟以上的重新构建

    更新3: 我现在已经将我的整个代码库从
    swift3
    重新编写为
    swift2.3
    。这没有任何区别,问题在于
    Xcode 8
    编译器

    更新4: 我可以确认取消选中这两个选项 将缓解一段时间的痛苦,
    xcode8
    bug似乎确实与它如何检查文件之间的依赖关系有关

    更新5: 我已经将我的代码库从
    Swift 2.3
    转换为
    Swift 3
    ,因为
    Xcode 8.2
    beta版需要它,所以beta版应该包含一个修复程序,用于“当只发生了小的更改时,Xcode不会重建整个目标。(28892475)”。遗憾的是,他们还没有修复这个bug,我的编译时间与
    Xcode 8.2 Beta版的编译时间完全相同

    原职: 我没有足够的声誉发表评论,但我仍然想分享一些资源。我已经被困在这种痛苦中好几天了,升级到
    swift3
    是一场彻底的灾难

    我用它来跟踪慢文件,尽管和你一样,这不是我的问题。xcode中的其他内容实际上需要4分钟才能完成:

    我还确保没有任何swift不喜欢的
    惰性变量
    闭包
    。连接字符串等时,不要使用
    +运算符


    如果我发现任何问题,我会更新这个答案,使用
    Swift 3
    ATM几乎不可能有效率。

    Swift\u整体模块\u优化=是

    Xcode版本:8.1 GM

    要添加,请选择目标,然后转到
    编辑器>添加生成设置>添加用户定义设置
    ,并添加上述内容

    我的干净构建时间从35分钟下降到了8分钟,项目文件数为800


    注意:首先在Xcode 8.0上尝试了这个,但没有成功。

    我使用的是Xcode 8.1,我的问题是字典使用了
    Nil合并运算符

    这是我花10分钟构建的代码:

        let params: [String:String] = [
            "email": email ?? self.email,
            "clave": password,
            "tipo_documento": documentType?.rawValue ?? self.typeDocument.rawValue,
            "documento": number ?? self.documentNumber,
            "nombre": name ?? self.name,
            "apellidos": lastName ?? self.lastName,
            "fecha_nacimiento": birth?.parse() ?? self.birthDate.parse(),
            "genero": genre?.rawValue ?? self.genre.rawValue,
            "telefono_movil": cel ?? self.cel,
            "direccion": address ?? self.address
        ]
    
    我不知道为什么,但它告诉我这本词典要花很长时间来编纂

    然后我将其更改为:

        var params: [String:String] = [:]
            params["email"] = email ?? self.email
            params["clave"] = password
            params["tipo_documento"] = documentType?.rawValue ?? self.typeDocument.rawValue
            params["documento"] = number ?? self.documentNumber
            params["nombre"] = name ?? self.name
            params["apellidos"] = lastName ?? self.lastName
            params["fecha_nacimiento"] = birth?.parse() ?? self.birthDate.parse()
            params["genero"] = genre?.rawValue ?? self.genre.rawValue
            params["telefono_movil"] = cel ?? self.cel
            params["direccion"] = address ?? self.address
    

    希望它能帮助你们中的一些人。

    我将一个包含17个文件的Swift 2x项目迁移到Swift 3,在所有文件中有28个警告和55个错误。编译时间为4-5分钟

    禁用

    Find Implicit Dependancies 
    
    计划和

    SWIFT_WHOLE_MODULE_OPTIMIZATION = YES 
    
    只做了一些小的改进

    当我最终清除每个文件中的警告和错误时,编译时间缩短了,现在只需几秒钟。IDE恢复了应有的性能—几乎实时地检测错误并快速编译

    首先,编译器似乎正在重新编译(或至少交叉检查)每个文件,但有任何错误或警告-即使自上次编译以来您尚未编辑该文件


    第二,如果文件之间有太多的依赖错误/警告,编译器就会出现瓶颈并立即减慢速度

    我发现有几种编码风格需要花很多时间在Swift中编译(2.3,未在3上测试):

    应该是

    a = a + b
    
    var a = [1,3,4]
    var b = [5,6,7,8]
    var c = [8,4,3,5]
    var d : [Int] = []
    d.appendContentsOf(a)
    d.appendContentsOf(b)
    d.appendContentsOf(c)
    
    还要将阵列添加到一起:

    var a = [1,3,4]
    var b = [5,6,7,8]
    var c = [8,4,3,5]
    var d = a + b + c
    
    应该是

    a = a + b
    
    var a = [1,3,4]
    var b = [5,6,7,8]
    var c = [8,4,3,5]
    var d : [Int] = []
    d.appendContentsOf(a)
    d.appendContentsOf(b)
    d.appendContentsOf(c)
    

    上一次优化将1方法的编译时间从9800ms缩短到了5.5ms。

    此外,
    字符串串联在Swift3/XCode8中的速度似乎非常慢:

    item.text = item.text + " " + pickerText + " " + (attribute?.Prefix ?? "") + inputText + (attribute?.Suffix ?? "")
    
    ~编译耗时8-10秒

    item.text = "\(item.text) \(pickerText) \(attribute?.Prefix ?? "")\(inputText)\(attribute?.Suffix ?? "")"
    
    item.text = [item.text, " ", pickerText, " ", (attribute?.Prefix ?? ""), inputText, (attribute?.Suffix ?? "")].joined();
    
    ~1,6秒完成编译

    item.text = "\(item.text) \(pickerText) \(attribute?.Prefix ?? "")\(inputText)\(attribute?.Suffix ?? "")"
    
    item.text = [item.text, " ", pickerText, " ", (attribute?.Prefix ?? ""), inputText, (attribute?.Suffix ?? "")].joined();
    

    ~0001秒编译时间

    每当您遇到编译速度慢的问题时,closly会查看您应用程序中包含的第三方SDK,并尝试找到您的编码技术

    item.text = "\(item.text) \(pickerText) \(attribute?.Prefix ?? "")\(inputText)\(attribute?.Suffix ?? "")"
    
    item.text = [item.text, " ", pickerText, " ", (attribute?.Prefix ?? ""), inputText, (attribute?.Suffix ?? "")].joined();
    

    我在我的应用程序中遇到过两次这个问题,我觉得连接多个字符串也会导致编译时间增加,例如,在我的情况下,我的编译时间非常高,因为这行代码:

    let fecha = post.dia + " " + post.num_dia + " " + post.mes + " - " + post.hora
    
    当我将代码更改为此时,它会在几秒钟内开始编译:

    var fecha = post.dia!
    fecha = fecha + " "
    fecha = fecha + post.num_dia!
    fecha = fecha + " "
    fecha = fecha + post.mes!
    fecha = fecha + " - "
    fecha = fecha + post.hora!
    

    在Xcode 8中,我也经历过稍微慢一点的构建时间,但并没有达到这个程度。只是想知道。。。您电脑的规格是什么?@TDM我配备了以下设备:2013年末的Macbook Pro,2.4 GHz Intel Core i5,8GB 1600 MHz DDR3 RAM,运行OS X El Capitan版本10.11.6