SwiftUI 大数组(超过 3 万个元素)需要永远迭代

时间:2021-06-24 03:40:13

标签: arrays swift performance swiftui hierarchical-clustering

我很困惑发生了什么,但基本上,这是我的代码。也许我只是愚蠢或在 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)")
                  }
                    
                }
            }

1 个答案:

答案 0 :(得分:3)

我相信时间是由您对 @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)")
                    
}
相关问题