gpt4 book ai didi

Swift 类型检查在非常短的函数上花费的时间太长

转载 作者:行者123 更新时间:2023-12-03 14:24:45 24 4
gpt4 key购买 nike

我设置了 Swift 编译器标志 -warn-long-function-bodies到 90 毫秒,查看我项目中的哪些函数编译时间过长(由于类型检查)。

我有以下方法:

func someKey(_ sectionType: SectionType, row: Int) -> String {
let suffix = row == 0 ? "top" : "content"
return "\(sectionType)_\(suffix)"
}

( SectionType 是一个字符串支持的枚举)

如上,需要 96ms 在 2017 款 MacBook Pro 上。我尝试的第一件事是绕过字符串插值并使用 \(sectionType.rawValue)而不是 \(sectionType) ,但现在它给了我 106 毫秒 .走错了...

接下来,我改变了:
let suffix = row == 0 ? "top" : "content"

到:
let suffix = "top"

警告消失了,所以是三元运算符造成了麻烦。

我尝试了这个:
let suffix: String = { // Note the type annotation!
if row == 0 {
return "top"
}
return "content"
}()

...但现在是闭包需要 97 毫秒(整个函数,101)。

我什至尝试了更明确的:
    let suffix: String = {
if row == 0 {
return String("top")
} else {
return String("content")
}
}()

...我得到了关闭:94ms;函数:98ms。

这是怎么回事?

我的 90 毫秒限制是否太低?我知道 存在(是?)类型检查错误。字典 文字,但这似乎完全不同......?

我的环境是 Xcode 8.3.2 (8E2002),
swift : Apple Swift version 3.1 (swiftlang-802.0.53 clang-802.0.42)
可是等等!还有更多...

我试过这个函数体:
func someKey(_ sectionType: SectionType, row: Int) -> String {
if row == 0 {
return "\(sectionType.rawValue)_top"
} else {
return "\(sectionType.rawValue)_content"
}
}

...并且需要97ms~112ms!?

附录:我将函数和枚举移植到一个干净的最小项目(单 View 应用程序)中,设置了相同的警告,但没有发生。我确信整个项目会以某种方式影响这种方法,但还不能完全确定如何......

附录 2 :我测试了我的函数的静态版本:无论 row的值如何,都使用固定后缀“top” (这需要不到 90 毫秒并且不会触发任何警告), 但是 添加了以下 if堵塞:
func someKey(_ sectionType: SectionType, row: Int) -> String {
if row == 0 {
print("zero")
} else {
print("non-zero")
}

let suffix: String = "top"
return "\(sectionType)_\(suffix)"
}

这让我回到了 96~98 毫秒! 那么在将行与零进行比较时会出现问题吗?

解决方法:我一直在玩我的代码,不知怎的发现,如果我替换 if带有 switch 的 block 声明,问题消失了:
func someKey(_ sectionType: SectionType, row: Int) -> String {
let suffix: String = {
switch row {
case 0:
return "top"
default:
return "content"
}
}()
return "\(sectionType)_\(suffix)"
}

(我不会回答我自己的问题,因为我不认为这是对真实情况的解释)

最佳答案

我认为这是三元运算符。

我在 Xcode 11 (~93ms) 中得到了类似的结果,但编译时间减少到~23ms:

func someKey(_ sectionType: SectionType, row: Int) -> String {

var suffix = "top"

if row != 0 {
suffix = "content"
}

return "\(sectionType)_\(suffix)"
}

通过改变这一行的逻辑,我认为我们可以证明它是三元逻辑,因为该方法减少到~1ms。我刚刚将 row 设为 bool 值。
func someKey(_ sectionType: SectionType, row: Bool) -> String {
let suffix = row ? "top" : "content"
return "\(sectionType)_\(suffix)"
}

同样(没有双关语)将三元逻辑更改为 let suffix = row != 0 ? "top" : "content"编译时间减半。这与我的第一个代码块相当。 != Swift 理解比 == 更快.

关于Swift 类型检查在非常短的函数上花费的时间太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44693330/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com