SwiftUI 大数组(超过 30K 元素)永远迭代

SwiftUI Large Array (over 30K elements) taking forever to iterate over

我对发生了什么感到很困惑,但基本上,这是我的代码。也许我只是很愚蠢或者在 swift 以上做得还不够,但我觉得这应该花费不到一秒钟的时间,但是迭代需要很长时间(我添加了 CFAbsoluteTimeGetCurrent)因为我想看看每个任务花费了多长时间,每个任务花费了大约 0.0008949041366577148 秒,但在 30K 的跨度内加起来很明显。这只是测试代码,但我真正想做的是使用 Swift 中的单个链接实现凝聚聚类,起初我认为我的算法写得不好但后来我只是尝试迭代一个数组这仍然花了很长时间。有人知道怎么回事吗?

我也知道在控制台中打印语句需要时间,但即使在删除这些语句之后,onAppear 闭包仍然需要一段时间才能完成。

也很抱歉,这是我第一次在 Stack Overflow 上发帖,所以如果我以后应该以某种方式写我的帖子,请告诉我。

    @State private var mat: [Double?] = Array(repeating: nil, count: 30000)
    
    var body: some View {
        Text("HELLo")
            .onAppear() {
                for i in 0..<matrix.count {
                    let start = CFAbsoluteTimeGetCurrent()
                    mat[i] = 0
                    let diff = CFAbsoluteTimeGetCurrent() - start
                    print("HAC_SINGLELINK.init TIME: \(diff), ROW \(i) of \(matrix.count)")
                  }
                    
                }
            }

我认为时间是由您对 @State 变量所做的修改次数造成的,这会导致大量开销。

使用您的初始代码,在我的机器上,大约需要 16 秒。使用我修改后的代码,它对临时非状态变量进行所有修改,然后分配给 @State 一次,它需要 0.004 秒:

.onAppear() {
    let start = CFAbsoluteTimeGetCurrent()
    
    var temp = matrix
    
    for i in 0..<temp.count {
        temp[i] = 0
    }
    let diff = CFAbsoluteTimeGetCurrent() - start

    matrix = temp
    
    print("HAC_SINGLELINK.init TIME: \(diff) \(matrix.count)")
                    
}