使用 nil 合并运算符的快速编译时间

Ole*_*huk 5 compilation swift

阅读有关快速编译时间的文章后。我感兴趣的是为什么使用超过 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)
 }
Run Code Online (Sandbox Code Playgroud)

编译时间 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
}  
Run Code Online (Sandbox Code Playgroud)

Aar*_*sen 5

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