快速并发操作速度较慢2倍



我有一个我需要保存到领域的大型JSON数组,问题是该操作持续约45秒,而这太长了。我尝试为JSON数组中的每个元素同时运行保存操作:

for element in jsonArray { // jsonArray has about 25 elements
  DispatchQueue.global(qos: .userInitiated).async {
    let realm = try! Realm()
    let savedObject = realm.objects(MyObject.self).filter("name == '(element.name)'")
    for subElement in element { // element is an array that has around 1000 elements
      let myModel = MyModel(initWith: subElement) // MyModel initialization is a simple light weight process that copies values from one model to another
      savedObject.models.append(myModel)
    }
  }
}

当我尝试运行相同的代码时,但是使用DispatchQueue.main.async,即使不是并发,也要快地完成2倍。我还尝试使用服务质量.userInteractive运行上述代码,但这是相同的速度。

运行此代码时,CPU利用率约为30%,内存约为45 MB。是可以加快此操作的速度吗?

  1. 整个循环应在DispatchQueue.global(qos: .userInitiated).async块内部。
  2. 如Realm网站上的记录:

    领域写操作是同步和阻塞,而不是异步。如果螺纹A启动写入操作,则螺纹B在螺纹A完成之前在同一领域上启动写入操作,在螺纹B螺纹B的写入操作之前,螺纹A必须完成并进行交易。写操作总是自动在BeginWrite()上自动刷新,因此不会通过重叠写作创建种族条件。

    这意味着您尝试在多个线程中写入任何好处。

最新更新