【发布时间】:2011-11-08 04:57:20
【问题描述】:
我的 iPhone 应用程序有一个实体 Words,其属性为 word、length 和 language。两者都被索引:
我将 cdatamodel 和数据库复制到一个单独的导入器应用程序中,在该应用程序中预先填充了大约 40 万个不同语言的单词。我通过查看 SQLite 文件验证了导入,然后将预填充的数据库复制回 iPhone 项目。
首先我认为(简单的)谓词是问题所在。但是即使从 fetch 请求中删除了谓词,执行也需要很长时间:
2011-09-01 09:26:38.945 MyApp[3474:3c07] Start
2011-09-01 09:26:58.120 MyApp[3474:3c07] End
我的代码如下所示:
// Get word
NSLog(@"Start");
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Words" inManagedObjectContext:appDelegate.managedObjectContext];
[fetchRequest setEntity:entity];
NSError *error = nil;
NSArray *fetchedObjects = [appDelegate.managedObjectContext executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
//... error handling code
}
[fetchRequest release];
NSLog(@"End");
return fetchedObjects;
数据库中的条目数量对 Core Data 来说是个问题吗?
编辑:
正如 gcbrueckmann 和 jrturton 指出的那样,设置fetchBatchSize 是一个好点。但是获取时间仍然不尽人意:
-
带有谓词集的 2 秒:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"length == %d AND language BEGINSWITH %@", wordLength, lng]; [fetchRequest setPredicate:predicate];
-
批量大小设置为 7 秒:
[fetchRequest setFetchBatchSize:1];
-
1 秒同时设置谓词和批量大小
还有另一个瓶颈吗?
【问题讨论】:
-
在您的谓词中是语言可能比长度更具限制性,有时谓词检查的顺序也可以加快速度。例如,在这种情况下,如果 60% 的单词符合您的长度标准,但只有 40% 符合语言标准,最好先检查语言。另一件事可能是,如果您需要更快的速度,那就是预先加载它,然后在内存中过滤一个数组,但不确定您的 iphone 应用程序是否可以处理。
-
在这种情况下,第一个查询是比较整数(索引会使这非常快),第二个是字符串比较(即使是索引字符串也不会很快) - 我会如果重新排序查询有帮助,您会感到惊讶。但是,请尝试一下 - 我很想看看它是否有帮助!
-
哦,我忘了说:我已经尝试过交换谓词的顺序,它不会加快获取速度。
标签: iphone performance core-data