快速并发操作速度降低2倍

时间:2019-03-19 12:22:04

标签: ios swift performance realm

我有一个大的JSON数组,需要保存到Realm,问题是此操作持续约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 个答案:

答案 0 :(得分:3)

  1. 整个循环应位于DispatchQueue.global(qos: .userInitiated).async块内。
  2. the Realm website所述:

      

    领域写入操作是同步和阻塞的,而不是异步的。如果线程A开始写操作,则线程B在线程A完成之前在同一域上开始写操作,线程A必须完成并提交其事务,然后线程B才执行写操作。写操作始终在beginWrite()上自动刷新,因此不会因重叠的写操作而产生竞争条件。

    这意味着尝试编写多个线程不会获得任何好处。