快速并发操作慢2倍

Ome*_*ega 6 performance realm ios swift

我有一个需要保存到Realm的大型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)
    }

  }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试运行相同的代码时DispatchQueue.main.async,即使不是并发运行,它的完成速度也要快2倍左右。我也尝试过以服务质量运行上面的代码,.userInteractive但是速度相同。

当我运行此代码时,CPU利用率约为30%,内存约为45 MB。是否有可能加快此操作的速度,否则我会走到尽头?

rma*_*ddy 3

    \n
  1. 整个循环应该在DispatchQueue.global(qos: .userInitiated).async块内。
  2. \n
  3. 正如Realm 网站上记录的那样:

    \n\n
    \n

    Realm 写入操作是同步且阻塞的,而不是异步的。如果线程 A 开始写操作,则线程 B 在线程 A 完成之前在同一 Realm 上开始写操作,则线程 A 必须在线程 B\xe2\x80\x99s 写操作发生之前完成并提交其事务。写入操作始终在 beginWrite() 上自动刷新,因此重叠写入不会产生竞争条件。

    \n
    \n\n

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

  4. \n
\n