我正在构建一个基于healthKit的应用程序,我想知道如何最好地保存healthKit数据。
我目前的方法是获取数据并将其保存为自定义类对象的属性,然后将其作为NSData保存在核心数据中。
在性能方面,Realm比CoreData更快?
根据http://qiita.com/moriyaman/items/1a2916f4c2b79e934370 CoreData显然比FMDB慢,后者比Realm慢。即使考虑到故障和索引,有人可以确认这是否属实?
答案 0 :(得分:8)
免责声明:我在Realm工作
哪种持久性产品在您提到的解决方案中表现最佳的问题在很大程度上取决于数据的类型/数量/频率。由于Core Data和FMDB是SQLite的层,因此它们在设计上不会比SQLite快,但它们为许多用户提供了足够的便利。另一方面,Realm不是基于SQLite,而是基于专为现代智能手机设计的自定义数据库引擎。它旨在在强大的功能,简单的API之间取得更好的平衡,而不会增加大的性能。
您可以在此处看到Realm / SQLite / Core Data / FMDB在Realm的发布博客文章中的公共基准:http://realm.io/news/introducing-realm#fast
最后,使用像NSCoding这样的方法将HealthKit信息序列化到NSData将会非常低效。无论您选择哪种持久性解决方案,通过使用内置于这些产品的序列化而不是存储已经序列化的数据blob,您将获得更好的服务。
答案 1 :(得分:3)
正如我对@jpsim所评论的那样,很难简单地将Core Data的性能与FMDB等低级框架或Realm等不同抽象的框架进行比较。您选择哪种方法将极大地影响您构建程序的方式,这会将性能问题转移到不同的地方。
Core Data和SQLite解决了截然不同的问题。 SQLite是一个关系数据库。 Core Data是一个对象持久性引擎。我不是Realm的专家,但它似乎试图在这两种方法之间取得平衡,其中更低级别的控制比Core Data提供的更多,但是与对象模型的关系比SQLite更紧密。 Realm(至少在我对它的印象中)为您提供更多低级别控制这一事实为您提供了优化事物或让IMO搞砸的机会。这既不好也不坏,只是让它们难以比较,特别是使通用的“性能基准”成为问题。问题不在于某人是否有可能使用引擎A和引擎B编写更快的代码。问题是你是否可能在每个引擎中编写可接受的高性能代码,同时避免错误,并最大限度地缩短开发时间。
一般来说,我认为HealthKit数据应该存储在HealthKit中以保护隐私。无论如何,您应该小心将这些数据存储在您自己的存储中。要特别注意the guidelines about iCloud:
使用HealthKit框架在iCloud中存储用户健康信息的应用程序将被拒绝
我不知道这会如何影响您存储的文档,然后备份到iCloud。将数据留在HealthKit中是不必担心此类问题的最佳方式。
但无论如何,性能只是需要考虑的一个轴。您没有任何迹象表明您有非常特殊的性能问题(例如,您正在处理成千上万条记录,或实时数据,或类似的东西)。因此,我将首先关注哪种工具最能满足您的一般需求,然后进行一些基本实验以确保性能合理,然后在发现问题时进行优化。