使用RLMResults作为collectionView的数据源时性能良好。
问题是:我如何加快速度,以便每次在显示的列表中添加新项目时,我的UI不会挂起1/10秒?
首次访问Realm对象的新实例时,初始化一个单元格最多需要100毫秒。
消息对象具有以下属性:
dynamic var id = NSUUID().UUIDString
dynamic var chatUserId = ""
dynamic var messageId: String? = nil
dynamic var directionRaw = "out"
dynamic var message: String? = nil
dynamic var mediaId: String? = nil
let read = RealmOptional<Int64>()
let received = RealmOptional<Int64>()
dynamic var created: Int64 = 0
dynamic var pending = false
我的collectionView的DataSource是:
let realm = try! Realm()
self.messages = realm.objects(Message).filter("chatUserId = %@", chatUserId).sorted("created", ascending: false)
需要90毫秒的地方是:
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("MessageViewCell", forIndexPath: indexPath) as! MessageViewCell
let message = messages![indexPath.row] // 90ms!!!
cell.messageTextLabel.text = message.message!
return cell
}
境界0.98.3
问题对话在GitHub上继续:https://github.com/realm/realm-cocoa/issues/3312
答案 0 :(得分:1)
您的问题遗漏了许多重要细节,以便为您提供帮助。以下是在分析Realm性能时应该问自己的问题:
Message
个对象?您拥有的对象越多,Realm将需要搜索以执行初始查询。如果在执行初始查询需要90毫秒时有5个项目,那么速度非常慢,应该向Realm团队报告以进行更多性能分析。如果您的数据库中有一百万个项目,那么90ms非常好!可能的情况是你的数据集存在于那里的中间位置。
Message.chatUserId
属性是否已编入索引?Realm(与大多数数据库一样)能够将属性类型标记为索引,这会降低写入速度,但会加速某些类型的查询,例如查询是否相等。如果这类查询在您的应用中对性能至关重要,则应考虑对其进行索引。请确保在您的应用中对真实设备上的影响进行分析,但要真实地评估它是否适合您!
您可以在此处了解有关Realm索引的更多信息:https://realm.io/docs/swift/latest/#indexed-properties
在调试或发布模式下运行很容易影响Realm的性能。调试模式具有更好的调试信息,而释放模式更快但检查更少。每当运行基准测试或性能分析时,您应该在真实的iOS设备上运行您的应用程序,并在应用程序内置于发布模式。
设备承受的压力也会影响性能。例如,磁盘I / O内存和争用,CPU使用率,线程数访问Realm文件等。
毕竟,如果您仍然认为Realm在这种情况下的表现不合理,我建议您在Realm的GitHub存储库中提交一个问题以及一个再现这种不良行为的基准示例项目:https://github.com/realm/realm-cocoa/issues/new
更新:此外,Realm还有一些机制可以有效地保持查询的实时性并始终保持最新状态(请参阅Auto-Updating Results上的文档),以便后续访问结果的速度应该快于最初的一个。