核心数据性能:NSPredicate比较对象

时间:2011-12-22 23:00:01

标签: performance core-data profile nspredicate nsfetchrequest

如果我的Author NSManagedObject模型具有authorID属性(由服务器确定),如果NSFetchRequest过滤NSPredicateauthorID的效果会更好{1}}而不是完整的Author对象?假设我正在通过某个Book获取所有NSManagedObject author个。哪个predicateFormat更好?

[NSPredicate predicateWithFormat:@"author = %@", anAuthor]

[NSPredicate predicateWithFormat:@"author.authorID = %@", anAuthor.authorID]

描述此内容的最佳方式是什么?我的核心数据测试与OCUnitSenTestingKit)一起使用。 iOS有类似Ruby's Benchmark module的内容吗?

2 个答案:

答案 0 :(得分:1)

使用-com.apple.CoreData.SQLDebug 1参数运行您的应用可能值得详细here

然后,您可以看到Core Data是否在两种情况下都执行相同的SQL(假设您使用的是SQLite存储)。

答案 1 :(得分:0)

第一个(仅使用Author)可能会更快,但只有测试才会告诉您。

如果您获取(例如Book)与Author有关系并且您使用谓词的对象

[NSPredicate predicateWithFormat:@"author = %@", anAuthor]

SQLite可以查看BookAuthor的合并表是否具有针对给定author的合适主键。换句话说,谓词变成对Author实体主键的检查。但是,CoreData仍然需要参考合并表。

如果您使用

[NSPredicate predicateWithFormat:@"author.authorID = %@", anAuthor.authorID]

然后SQLite必须join合并表与实际的Author表,然后匹配生成的authorID列。那将是更多的工作。如果authorID没有编入索引,它就会崩溃。