核心数据计数(for :)比参数计数慢得多

发布于 2025-02-08 18:03:12 字数 1793 浏览 0 评论 0原文

我有两个实体,ManagedEventManagedEdeventData

final class ManagedEvent: NSManagedObject {
  @nonobjc
  class func fetchRequest() -> NSFetchRequest<ManagedEvent> {
    return NSFetchRequest<ManagedEvent>(entityName: "Event")
  }

  @NSManaged private(set) var name: String
  @NSManaged var data: NSOrderedSet?
}
final class ManagedEventData: NSManagedObject {
  @nonobjc
  class func fetchRequest() -> NSFetchRequest<ManagedEventData> {
    return NSFetchRequest<ManagedEventData>(entityName: "EventData")
  }

  @NSManaged private(set) var id: String
  @NSManaged private(set) var createdAt: Date
  @NSManaged private(set) var name: String
  @NSManaged private(set) var parameters: Data

data每个MANGEDEDEVENT的变量是与经常关系ManagedEventData对象。 name MANCANEDEVENT的变量设置为name ManagedeDeventData的变量。

现在,我想计算某个名称存在多少ManagedeDeventData对象。我找到了两种方法,但是一个比另一个方法要慢很多。

第一种方法是这样:

let fetchRequest = ManagedEventData.fetchRequest()
fetchRequest.predicate = NSPredicate(format: "name == %@", eventName)
return try mainContext.count(for: fetchRequest)

对于11k takandeDeventData项目,这将在0.011秒内返回。

另一种方法是首先检索ManagedEvent,然后通过访问其Data属性来获取其计数:

let fetchRequest = ManagedEvent.fetchRequest()
fetchRequest.predicate = NSPredicate(format: "name == %@", eventName)
return try context.fetch(fetchRequest).first!.data!.count

对于11K ManagedeDeventData项目,这是更快的速度而且只需要0.002秒。

为什么这是我该如何提高它的速度?第二种方法是否会占用更多内存,因为我要访问数据?有没有更好的方法来建模这些数据?

I have two entities, ManagedEvent and ManagedEventData:

final class ManagedEvent: NSManagedObject {
  @nonobjc
  class func fetchRequest() -> NSFetchRequest<ManagedEvent> {
    return NSFetchRequest<ManagedEvent>(entityName: "Event")
  }

  @NSManaged private(set) var name: String
  @NSManaged var data: NSOrderedSet?
}
final class ManagedEventData: NSManagedObject {
  @nonobjc
  class func fetchRequest() -> NSFetchRequest<ManagedEventData> {
    return NSFetchRequest<ManagedEventData>(entityName: "EventData")
  }

  @NSManaged private(set) var id: String
  @NSManaged private(set) var createdAt: Date
  @NSManaged private(set) var name: String
  @NSManaged private(set) var parameters: Data

The data variable of each ManagedEvent is a to-many relationship of ManagedEventData objects. The name variable of ManagedEvent is set to the name variable of ManagedEventData.

Now, I want to count how many ManagedEventData objects exist for a certain name. I have found two way of doing this, but one is a lot slower than the other.

The first way is like this:

let fetchRequest = ManagedEventData.fetchRequest()
fetchRequest.predicate = NSPredicate(format: "name == %@", eventName)
return try mainContext.count(for: fetchRequest)

For 11k ManagedEventData items, this returns in 0.011 seconds.

The other way is to first retrieve the ManagedEvent and then get its count by accessing its data property:

let fetchRequest = ManagedEvent.fetchRequest()
fetchRequest.predicate = NSPredicate(format: "name == %@", eventName)
return try context.fetch(fetchRequest).first!.data!.count

For 11k ManagedEventData items, this is way faster and only takes 0.002 seconds.

Why is this and how can I improve the speed of this even further? Does the second way take up a lot more memory because I'm accessing data? Is there a better way to model this data?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文