核心数据和性能不佳

Posted

技术标签:

【中文标题】核心数据和性能不佳【英文标题】:Core Data and poor performance 【发布时间】:2010-06-07 16:13:14 【问题描述】:

我已经处理这个问题一段时间了,我愿意接受任何最佳做法/建议。

示例

所以我创建了一个示例核心数据应用程序。该应用程序基本上是对 AddressBook 应用程序的模仿。我有以下实体:组、联系人、地址、电话、电子邮件、网页、日期。

您可能已经猜到,一个组可以有多个联系人,一个联系人可以在多个组中。联系人也可以有多个地址、电话、电子邮件、网页和日期。

我基本上从 AddressBook 将大约 600 个联系人导入到此应用程序中。用户界面相对简单...左侧的组/类别列表和右侧的 NSCollectionView 或 NSTableView 显示取决于所选组的联系人列表。(集合视图或表格视图...正如我添加的显示任一视图的能力,两者都绑定到 NSArrayController)

我通过代码而不是 Interface Builder 引入 Group 元素,因为我想使用类似事物的侧边栏,而且这样做更容易。

问题

其中一个类别包含所有联系人,而另一个类别仅包含 2 个联系人。当我选择包含所有联系人的类别时,信息需要 8-10 秒才能填充集合或表格视图。然而,在 AddressBook 本身中做同样的事情非常快速,几乎是即时的。我正在使用 SQLLite 存储类型,并尝试使用多种不同的方法,包括尝试通过 Instruments 诊断问题,但没有任何效果。

我尝试将谓词设置为联系人的数组控制器的 defaultFetchPredicate,而不是设置过滤谓词,但这不起作用。

我尝试了 preFetching 和错误,但我不确定我是否做得对,如果 Interface Builder 处理联系人的 NSArrayController,我不确定如何完成它。

另一个例子

我还尝试下载了一个示例 Core Data 应用程序......虽然它的关系模型比我所做的更简单(基本上,一个 Molecule 具有 Atom 对象,而 Atom 对象具有 Element 对象),但我插入了 65,000 条记录,它表现得像个魅力。

问题

我基本上碰壁了,我想知道是否有其他人知道为什么会发生这种情况以及解决/克服/避免此类问题的最佳方法?

谢谢!

【问题讨论】:

可以选择10个或20个为一组的相关项目,并在显示前10-20个后继续在后台异步加载。 与 Instruments.app 交朋友。与所有性能问题一样,在您获得性能数据之前,任何答案最多只能是猜测。特别注意核心数据的获取、缓存未命中,以及可能的整体对象分配。 我确实注意到获取的次数比我认为应该发生的要多得多。例如,当应用程序第一次启动时,它看起来像是多次获取 Contact 对象......它实际上获取了 abotu 800 次,但看起来获取计数只有 1。然后它又获取了两次它返回的地方两次适当数量的物体。非常奇怪,因为我没有在循环中运行任何这样的代码。 编辑:我找到了执行此操作的逻辑并将其注释掉,但问题仍然存在。选择组时 尝试发布您的托管对象模型的屏幕截图。 【参考方案1】:

事实证明,实际上是 NSCollectionView 减慢了速度。我猜视图的创建和操作 x 集合视图视图的数量会增加大量开销。本来可以使用 IKImageBrowserView,但它不是我想要的。

我最终更改了应用程序布局来解决这个问题。

谢谢大家!

【讨论】:

以上是关于核心数据和性能不佳的主要内容,如果未能解决你的问题,请参考以下文章

天蓝色缓存性能不佳

sklearn 中 GMM 的意外性能不佳

MySQL 大表性能不佳

RandomForestClassifier 性能不佳

RESTful 身份验证 - 导致高负载时性能不佳?

SqlDataAdapter 插入性能不佳