【问题标题】:Swift compilation time with nil coalescing operator使用 nil 合并运算符快速编译
【发布时间】:2016-09-03 03:45:16
【问题描述】:

在阅读了article 关于快速编译时间之后。我感兴趣的是为什么使用超过 2 个序列合并运算符会显着增加编译时间。

示例: 编译时间 3.65 秒。

 func fn() -> Int {    
        let a: Int? = nil
        let b: Int? = nil
        let c: Int? = nil

        return 999 + (a ?? 0) + (b ?? 0) + (c ?? 0)
 }

编译时间 0.09 秒。

func fn() -> Int {

    let a: Int? = nil
    let b: Int? = nil
    let c: Int? = nil

    var res: Int = 999

    if let a = a {
        res += a
    }

    if let b = b {
        res += b
    }

    if let c = c {
        res += c
    }

    return res
}  

【问题讨论】:

  • 这在 swift 4 或 swift 5 中仍然有效吗?我了解原因(类型推断)背后的原理,但现在看来可以改进。
  • @rmooney 我将第一个函数添加到一个现有文件中,编译器直接出错,说它无法在合理的时间内解析表达式。我认为它还没有解决。

标签: swift compilation


【解决方案1】:

我几乎可以肯定这与类型推断有关。在解释所有这些 +?? 运算符时,编译器在幕后做了大量工作来推断这些参数的类型。仅+ 运算符就有大约 30 个重载,当您将其中几个链接在一起时,编译器的工作比您想象的要复杂得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-31
    • 2018-10-24
    • 1970-01-01
    • 2017-08-26
    • 2017-11-03
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多