【问题标题】:Why is this piece of code so slow? (CoreData & NSSet)为什么这段代码这么慢? (CoreData & NSSet)
【发布时间】:2010-12-19 16:04:04
【问题描述】:

我有一个应用程序,我正在实施全文搜索。我有 2 个实体:关键字和文章之间存在多对多关系。 有问题的代码是这样的:

            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

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

【问题讨论】:

  • 您应该期望模拟器的运行速度明显快于设备。话虽如此,2/10 秒似乎确实很慢。 mySet 中有多少个对象?
  • 在 for 循环之前 mySet 中没有。例如,当我键入 d 时,mySet 会填充 17 个对象。大约需要一秒钟。
  • 请注意,使用NSLog 将所有内容打印到控制台也需要一些时间。您是在注意到速度慢之前还是之后添加了NSLog
  • 在注意到代码的哪一部分需要这么多时间来执行之后很慢

标签: iphone core-data ios4 nsset


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    尝试在上述代码的第一行之前调用[request setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObject:@"article"]];

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-31
      • 1970-01-01
      • 1970-01-01
      • 2017-01-10
      • 2011-08-31
      • 1970-01-01
      • 2011-04-24
      相关资源
      最近更新 更多