2010-12-19 11 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

シミュレータがデバイスよりも大幅に高速に動作することを期待する必要があります。つまり、2/10秒は遅いようです。 'mySet'にはいくつのオブジェクトがありますか?ループの前に – kubi

+0

があります。mySetには何もありません。たとえば、dと入力すると、mySetは17個のオブジェクトで塗りつぶされます。それには約1秒かかります。 –

+1

NSLogを使ってすべてのものをコンソールに出力するのにも時間がかかることに注意してください。あなたは遅さに気づく前に、または後に 'NSLog'を追加しましたか? – fabian789

答えて

0

私はCoreDataの専門家ではありませんが、記事を遅延読み込みしていませんか? yesの場合は、すべてのキーワードについてストアに対してクエリが実行されていることを意味します。

0

上記のコードの最初の行の前に[request setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObject:@"article"]];を呼び出してみてください。

それ以外の場合は、ループの各反復で記事の新規取得が生成されますが、必要なのは実際に必要です。

この場合、SQLDebugを使用して生成された実際のSQL文を確認すると便利です。 実行ファイルを右クリックし、「情報を見る」をクリックし、「引数」タブに行き、「起動時に渡す引数」に-com.apple.CoreData.SQLDebug 1を追加します。