【问题标题】:Xcode 8.0 Swift 3.0 slow indexing and buildingXcode 8.0 Swift 3.0 缓慢的索引和构建
【发布时间】:2017-01-25 14:38:33
【问题描述】:

我已经安装了 Xcode 8.0 并将 Swift 2.2 转换为 3.0(这个过程也花费了很多时间,我只是让我的 Mac 整夜运行)。我没有一个大项目(大约 20 个文件)。我也在使用Pods。以前 Xcode 版本(

我尝试过但对我没有帮助的事情:

  • 清理DerivedData 文件夹并重新启动Xcode
  • 清理项目并重新启动 Xcode
  • <project>.xcworkspace 删除Pods 目录,然后重新安装
  • 重新启动的 Mac
  • 尝试在没有 Pod 的情况下构建项目
  • 重新安装 Xcode
  • 在另一台 Mac 上尝试克隆项目

当开发人员不得不花费数小时来解决这些荒谬的问题时,制作这样的软件版本真的很不酷。这是非常令人失望的。 任何想法如何解决这个问题?

【问题讨论】:

  • 你能构建它吗?如果是这样,您可以使用构建时间分析器来了解更多关于减慢构建过程的原因。 github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode
  • @Robert 不幸的是它没有建立
  • 构建日志是否显示任何内容? (单击看起来像卡通气泡的最右侧按钮。)或者控制台应用程序中的任何内容?
  • 这在 Xcode 8.3 swift 3.1 上对我有用 - stackoverflow.com/a/40497873/1890317 我从一分钟多的构建时间缩短到了 17 秒

标签: ios xcode indexing swift3 xcode8


【解决方案1】:

转到项目设置,然后编辑器 > 添加构建设置 > 添加用户定义的设置,并添加以下内容:

SWIFT_WHOLE_MODULE_OPTIMIZATION = YES

对于一个 40KLOC 的 swift 项目,添加此标志后,我们的 clean-build 编译时间从 7 分钟缩短到了 65 秒,这是奇迹。还可以确认 2 位朋友在企业项目中看到了类似的改进。

我只能假设这是 Xcode 8.0 中的某种错误

【讨论】:

  • 也为我们的团队工作。我们在 Swift 和 Objective C 的代码库上运行 Xcode 8.0、Swift 2.3。
  • 这将我们的干净构建时间从 6 分钟缩短到了 2 分钟!此设置与构建配置优化级别有何不同,哪个优先?你到底是怎么发现这个的?非常感谢
  • @n8tr 我不确定这是否优先于正常的 WMO 设置。一个朋友偶然发现的!
  • 还没有人提到它,但这会破坏增量编译。因此,虽然您现在的干净构建速度更快,但您在更改一个文件时一次只需要重新构建几个文件的速度就会下降。
  • 这行得通,但它破坏了您在开发过程中依赖的一些东西:断点和单步执行是不可靠的,当您遇到断点并尝试查看变量的内容时,变量不可用, command + click 跳转到定义勉强有效。
【解决方案2】:

我通过注释所有文件然后一一删除 cmets 解决了这个问题。我发现问题仍然在数组声明中,如here 所述。

我有这样的代码,但项目没有索引:

class {
    var first: String!
    var second: String!
    var third: String!
    var fourth: String!
    var fifth: String!

    func abc() -> [String] {
        var array = [first, second, third, fourth, fifth]
    }
}

我已经把它改成了这个,索引开始工作了:

class {
    var first: String!
    var second: String!
    var third: String!
    var fourth: String!
    var fifth: String!

    func abc() -> [String] {
        var array = [first]

        array.append(second)
        array.append(third)
        array.append(fourth)
        array.append(fifth)
    }
}

【讨论】:

  • 这可能是推断数组类型的问题。而不是使用 append 这样做: var array: [String] = [first, second, third, Fourth, Fifth]
【解决方案3】:

我在升级到 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"]

【讨论】:

    【解决方案4】:

    我有类似的问题,并按照本指南进行调试:http://irace.me/swift-profiling 我的问题是我在某些字符串中有 nil 合并运算符,例如:

    let name = "\(someString ?? "")"
    

    这四种方法导致了 2 分钟的额外构建时间。

    【讨论】:

    • 链接指南是要走的路,在几分钟内就找到了罪魁祸首(也是 nil 合并运算符)并能够修改代码...
    【解决方案5】:

    我遇到了同样的问题,并通过逐行查看我的代码来解决它,事实证明 Swift 3 更喜欢字符串插值而不是使用 + 符号,即

    let url = "http://yahoo.com" + "someWebPage" + "whereItsInteresting" 
    

    如果你一直使用上述风格的代码,请将其替换为;

    let url = "http://yahoo.com\(someWebPage)\(whereItsInteresting)"
    

    您的构建时间将立即恢复正常。

    【讨论】:

    【解决方案6】:

    对于那些想要找到编译器在哪里“捕获”的人

    添加到Other Swift Flags-Xfrontend -warn-long-function-bodies=50

    查看完整答案here

    【讨论】:

      【解决方案7】:

      我尝试了上述解决方案,但问题仍然存在。调试工作也很奇怪。经过几天的研究,我找到了以下解决方案。

      选择主要目标 > 构建设置。如下图配置。

      【讨论】:

        【解决方案8】:

        我遇到了相同的索引问题,但仅在我在设备上运行/调试然后在左上角工具栏(目标 > iPhone)上切换到另一个设备时才发生。

        以上解决方案都不适合我。

        我的解决方案:我删除了我的本地 git 工作副本并从我的“原点”克隆了一个新副本。

        (在 xcuserdata/shared/session 等文件夹中有一些“神奇”文件可能导致此问题?)

        【讨论】:

          【解决方案9】:

          不是我认为这与 OP 的问题有关,而是 XCode 8 对我来说最近慢了下来。我最终发现这是我的错误(我记得是无意中这样做的)——我添加了 XCode.app 作为框架参考。这实质上使 XCode 搜索并索引整个 XCode.app 文件夹。一旦我看到错误并删除了框架,它就又好了:)

          【讨论】:

            【解决方案10】:

            我有一个函数需要一分钟多的时间来编译,经过一番调查,我发现罪魁祸首是在检查从存储的日期开始是否已经过了足够的时间:

            let myStoredDate: Double = // Double representing a time in the past
            
            // if at least one week (60 * 60 * 24 * 7 seconds) has passed since myStoredDate
            if Date().timeIntervalSince1970 - myStoredDate > (60 * 60 * 24 * 7){
                // do stuff
            }
            

            编译这段代码需要超过 10 秒的时间——再加上这段代码以不同的数字重复多次,导致编译时间过长。我可以通过预先计算间隔来解决这个问题

            let myStoredDate = // Double representing a time in the past
            
            //it is important to explicitly specify that the variable is a Double
            let interval: Double = 60 * 60 * 24 * 7
            
            if Date().timeIntervalSince1970 - myStoredDate > interval{
                // do stuff
            }
            

            在我检查了大约 10 次之后,编译时间从一分钟多一点减少到几毫秒。

            这个问题很可能也发生在其他地方的类型推断和数学组合中,因此请确保在您的代码中的其他任何地方都不会发生类似的情况。

            【讨论】:

              【解决方案11】:

              我的问题是字典。我有各种各样的大字典。

              let values = ["address":addressTextField.text,"city":cityTextField.text,"zipCode":zipCodeTextField.text,"state":stateTextField.text,"pet":answerLabel.text,"rentStart":rentStartTextField.text,"rentEnd":rentEndTextField.text,"rent":rentTextField.text,"phone":phoneTextField.text,"email":emailTextField.text,"status":leaseStatusTextField.text,"bedrooms":bedroomTextField.text,"parking":parkingLabel.text,"furnish":furnishLabel.text,"utilities":utilitiesTextField.text,"laundry":laundryTextField.text,"paymentCycle":paymentCycleTextField.text,"note":noteTextView.text]
              

              我把它分解为:

                      var values = ["address":addressTextField.text]
                      values["city"] = cityTextField.text
                      values["zipCode"] = zipCodeTextField.text
                      values["state"] = stateTextField.text
                      values["pet"] = answerLabel.text
                      values["rentStart"] = rentStartTextField.text
                      values["rentEnd"] = rentEndTextField.text
                      values["rent"] = rentTextField.text
                      values["phone"] = phoneTextField.text
                      values["email"] = emailTextField.text
                      values["status"] = leaseStatusTextField.text
                      values["bedrooms"] = bedroomTextField.text
                      values["parking"] = parkingLabel.text
                      values["furnish"] = furnishLabel.text
                      values["utilities"] = utilitiesTextField.text
                      values["laundry"] = laundryTextField.text
                      values["paymentCycle"] = paymentCycleTextField.text
                      values["note"] = noteTextView.text
                      values["owner"] = userID
              

              【讨论】:

                【解决方案12】:

                备份你的项目删除备份后最后更新的项目,然后简单重启Xcode :-)

                【讨论】:

                  【解决方案13】:

                  添加设置后,

                  SWIFT_WHOLE_MODULE_OPTIMIZATION = YES
                  

                  对于 650 个 swift 文件,我们的项目 clean-build 编译时间从 1200 秒到 180 秒。但这会导致增加编译失败。每次修改需要180s编译,增加编译只需要60s

                  【讨论】:

                    【解决方案14】:

                    这是一个 Xcode 错误(Xcode 8.2.1),当您有一个大字典文字或嵌套字典文字时会发生这种情况。您必须将字典分解成更小的部分并使用 append 方法添加它们,直到 Apple 修复该错误。

                    【讨论】:

                    • bug 修复了吗?
                    • 是的,我已经向 Apple 报告了这个错误,他们说他们在 Xcode 的最新版本中修复了它
                    【解决方案15】:

                    当“索引”卡住时,这对我在 Xcode 8.2.1 和 Swift 3 中有效:

                    我总是打开两个项目,一个虚拟项目和我正在处理的项目。我还连接了一台 iPad Air 设备,可以在上面运行我的项目。当我的项目卡在“索引”上时,我切换到我的虚拟项目并在我连接的 iPad Air 设备上运行我的项目。然后我停止项目 并切换回我正在处理的项目,“索引”神奇地完成了。如果您没有连接物理设备,这也应该仅适用于模拟器。

                    【讨论】:

                      【解决方案16】:

                      我遇到过类似的问题并开发了自己的实用程序?Rugby。 在当前版本中,Rugby 可以缓存所有远程 pod 依赖项,并将其目标从Pods 项目中删除。\

                      在底层,它使用了一些优化。比如SWIFT_COMPILATION_MODE=wholemodule

                      【讨论】:

                        【解决方案17】:

                        为我解决这个问题的方法是使用键来设置字典值

                        let dict: [string:any]()
                        dict["key"] = "value"
                        dict["key1"] = "value"
                        dict["key2"] = "value"
                        return dict
                        

                        如果您的字典很长,它可能会也可能不会导致编译循环,从而导致构建时间过长。任何超过 8 个键的内容都应设置为方式。

                        【讨论】:

                          猜你喜欢
                          • 2014-12-17
                          • 2017-12-30
                          • 1970-01-01
                          • 1970-01-01
                          • 2017-02-13
                          • 2017-06-26
                          • 1970-01-01
                          • 2017-03-30
                          • 1970-01-01
                          相关资源
                          最近更新 更多