2010-12-19 52 views
1

我有一个应用程序,我正在实施全文搜索。我有2个参与者:关键词和文章之间有多对多的关系。 有问题的一段代码是这样的:这段代码为什么这么慢? (CoreData&NSSet)

  keywordsInRange = [[[CoreDataManager sharedManager] managedObjectContext] executeFetchRequest:request error:&err]; 



      for(Keywords* word in keywordsInRange) { 
       NSDate *methodStart = [NSDate date]; 

       [mySet addObjectsFromArray:[word.article allObjects]]; 

       NSDate *methodFinish = [NSDate date]; 
       NSTimeInterval executionTime = [methodFinish timeIntervalSinceDate:methodStart]; 
       NSLog(@"Keyword Search Exec Time: %.3f", executionTime); 
      } 

输出是这样的:

Keyword Search Exec Time: 0.235 //added 1 article 
Keyword Search Exec Time: 0.216 //added 6 articles 
Keyword Search Exec Time: 0.211 //etc 
Keyword Search Exec Time: 0.205 
Keyword Search Exec Time: 0.204 

你可以看到,添加链接到设置关键字的所有文章花费意外长的时间,当我在设备上测试(iPad iOS 4.2.1)。当我在模拟器上测试时间为:

0.029 
0.026 
0.026 
0.026 
0.026 

哪里是错误的,我能做些什么来加快速度?

+0

您应该期望模拟器运行速度比设备快得多。这就是说,十分之二秒显得很慢。 'mySet'中有多少个对象?在循环之前有 – kubi 2010-12-19 16:20:47

+0

在mySet中没有。当我输入d例如mySet填充17个对象。大约需要一秒钟。 – 2010-12-19 16:46:19

+1

请注意,使用'NSLog'将所有东西打印到控制台也需要一些时间。你注意到缓慢之前还是之后添加了'NSLog'? – fabian789 2010-12-19 16:49:46

回答

0

我不是CoreData的专家,但不是它懒洋洋地加载文章?如果是,则表示存在针对每个关键字的商店执行的查询。

0

尝试在上面的代码的第一行之前拨打[request setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObject:@"article"]];

否则,循环中的每次迭代都会为文章生成新的提取,尽管您只需要一次。

在这种情况下,使用SQLDebug来查看正在生成的实际SQL语句通常很有帮助。 为此,请右键单击您的可执行文件,单击获取信息,转到参数选项卡并在“启动时传递的参数”中添加-com.apple.CoreData.SQLDebug 1