1

これが私の問題です。私はiOSのCoreDataを初めて使用するので、最適化の方法がよくわかりませんが、ここで他の多くの質問を見て、できる限り最適化しようとしました、しかし、何らかの理由で、100 行を取得するのにまだ 5 秒近くかかります! 呼び出されているコードは次のとおりです。

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    [self titles:searchText];
}
-(NSArray *)titles:(NSString *)toMatch
{
    NSMutableArray * retval = [[NSMutableArray alloc] init];
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    if(toMatch.length>2)
    {
        NSString *LabelText =toMatch;
        NSString *compareString = @"";
        for (int i = 0; i<LabelText.length; i++)
        {
            int letter = [LabelText characterAtIndex:i];
            NSString *blah;
            if(letter<100)
            {
                blah = [NSString stringWithFormat:@"0"];
                blah = [blah stringByAppendingFormat:@"%d", letter];
            }
            else
                blah = [NSString stringWithFormat:@"%d", letter];
            compareString= [compareString stringByAppendingString:blah];
            compareString = [compareString stringByAppendingString:@","];
        }
        NSFetchRequest *request = [[NSFetchRequest alloc] init];
        [request setEntity:entity];
        NSPredicate *predicate;
        if ([defaults boolForKey:@"FLS"])
            predicate = [NSPredicate predicateWithFormat:@"first_letter_start BEGINSWITH %@", compareString];
        else
            predicate = [NSPredicate predicateWithFormat:@"first_letter_start CONTAINS %@", compareString];
        [request setPredicate:predicate];
        [request setFetchLimit:100];
        [request setFetchBatchSize:1];
        [request setPropertiesToFetch:[NSArray arrayWithObject:@"gurmukhi"]];
        [request setReturnsObjectsAsFaults:NO];
        NSError *error;
        NSArray *fetchedObjects = [managedObjectContext executeFetchRequest:request error:&error];
        for (Gurbani *shabad in fetchedObjects)
        {
            [retval addObject:shabad.gurmukhi];
        }
        searchResults = retval;
        [searchResultsTable reloadData];
    }
    return retval;
};

デバッグ引数を入力した後のログは次のとおりです。

2013-01-11 18:04:57.195 GurbaniKhoj[2833:907] CoreData: sql: pragma cache_size=200
2013-01-11 18:04:57.199 GurbaniKhoj[2833:907] CoreData: sql: SELECT Z_VERSION, Z_UUID, Z_PLIST FROM Z_METADATA
2013-01-11 18:05:01.139 GurbaniKhoj[2833:907] CoreData: sql: SELECT 0, t0.Z_PK FROM ZSHABAD t0 WHERE  NSCoreDataStringSearch( t0.ZFIRST_LETTER_START, ?, 8, 0)  LIMIT 100
2013-01-11 18:05:06.705 GurbaniKhoj[2833:907] CoreData: annotation: sql connection fetch time: 5.5652s
2013-01-11 18:05:06.707 GurbaniKhoj[2833:907] CoreData: annotation: total fetch execution time: 5.5682s for 92 rows.

どうしたの?そして、これをより速くするために何ができますか?

編集: もう 1 つ気付いたのは、この速度が一貫していないことです。一部のクエリでは 5.5 秒、他のクエリでは 1.8 秒です。変動の原因がわかりません。

編集 2: インデックスが作成されていないことがわかりました。バージョン管理されたデータ モデルを作成し、インデックスが作成されていることを確認しました。ログは次のようになります

2013-01-15 03:06:29.671 GurbaniKhoj[1212:907] CoreData: sql: SELECT 0, t0.Z_PK FROM ZSHABAD t0 WHERE  NSCoreDataStringSearch( t0.ZFIRST_LETTER_START, ?, 8, 0)  LIMIT 100
2013-01-15 03:06:31.130 GurbaniKhoj[1212:907] CoreData: annotation: sql connection fetch time: 1.4588s
2013-01-15 03:06:31.132 GurbaniKhoj[1212:907] CoreData: annotation: total fetch execution time: 1.4607s for 92 rows.

EDIT 3:これをより速くする方法はありますか? これらの文字列比較をすべての文字列に対して行っていますが、1.5 秒が非常に速いとはまだ感じません。

4

2 に答える 2

2

ムヒ、

まず、当たり前のことをして、フィールドにインデックスを付けましたか?

2 つ目は、iOS デバイスのフェッチ時間が非常に遅いことです。これは技術的に Core Data の欠陥ではありません。(ただし、ここでは CD もパフォーマンスを低下させる原因となる可能性があります。) したがって、可能な限り、RAM に大量のフェッチを行い、そこで検索を絞り込む必要があります。たとえば、最初の文字が「b」の場合、それらすべてをフェッチしてから、RAM 内のそのサブセットから後続の入力文字で絞り込みます。これは非常に高速であることがわかります。

第 3 に、パフォーマンスのばらつきは、おそらく SQLite の行キャッシュと、MOC がいっぱいになっていることが原因です。

アンドリュー

于 2013-01-12T14:46:54.907 に答える
0

フェッチ バッチ サイズを 1 から 20 に変更してみてください。

[request setFetchBatchSize:20];
于 2013-01-15T08:26:28.387 に答える