頭と尻尾はくれてやる!

iOSアプリなどの開発日記です


Core Dataのデータを日付で高速に抽出したい

頭と尻尾はくれてやる! Core Dataのデータを日付順に高速でソートしたい
↑これに引き続き、Core Dataがらみで処理速度を測ってみました。

Core Dataでたくさんのデータがあって、NSDateクラスのdateってプロパティを持ってるというのは前回と同様。

この日付で特定の1ヶ月を抽出したいのです。
ソートじゃなくて抽出ね。
これをなんとか高速でしたい、と。

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(date >= %@ ) and (date < %@)",startDate,nextDate];
datas = [datas filteredSetUsingPredicate:predicate];

ここでstartDate,nextDateともにNSDate型で、この間のデータを抽出します。
フィルタリングの前後の時間を計測するわけですが、、、

実機だと、データ数1000個程度で940msecくらいかかったんですよ。
こりゃ、まずい。

で、なんとかしようと、各データ保存時に年月を表すようなプロパティを追加しました。
文字列型でdateYM で中身が @"201011"ってな感じで。
すると、
NSString * targetDateYM = @"201011";
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"dateYMD == %d",[targetDateYM intValue]];

このようにすれば、抽出できると。

最初のdateで評価する場合だと比較の式が二つあるわけだし、かなり短時間になるんじゃなかろうかと期待したんだけど、、、

結果はほとんど変わらず(あくまでデータ数1000個程度の場合)。

日付の式の前後を入れ替えても結果は変わらず。


あっかーん!orz


Core Dataのデータを日付順に高速でソートしたい

現在取り組んでいるアプリで、データ数が多くなるとページを切り替える時に一瞬遅れる。
うーん、気持ち悪い。
という状況なのでCore Dataでのデータの持ち方を再考中。

その過程で気になることがあったので実機でテストしてみました。

NSSet *datas;

ここにCore Dataから得た一連のデータが入れます。

NSArray *sortDiscriptors = [NSArray arrayWithObjects:[NSSortDescriptor sortDescriptorWithKey:@"date" ascending:YES], nil];

各データはdateってプロパティ名でNSDateクラスのデータを持っています。
このdateで日付順にソートするのが目的であります。

NSArray *datasArray = [datas sortedArrayUsingDescriptors:sortDiscriptors];

↑これでソート。
この前後で時間を実機で計測しました。

その結果、、、
1)データ数が1000個程度だと、840msec程度(こりゃ問題だ)
2)データ数が1000個程度だと、処理時間はデータのn数にほぼ比例

もしかしたら、処理時間はデータ数に対して指数関数的に増えていくのかな?
そうすると、データを分割して、、、なんて思ったんだけど、比例するんだから、1000個を1回するのと、(データの持ち方を工夫して)100個を10回するのもたいして変わらないんだろうな。
うーん、こりゃ困った。


む!
もしかしてNSDate型でソートすると、時間がかかるんじゃね?
もっとシンプルにNSInteger型だったらいいんじゃね?
なんて思って、日付を"20100101"ってNSInteger型のプロパティを持たして、比較してみたところ、、、

ほとんど変わりませんでした。

結果の追加
3)データ数が1000個程度だと、NSDate、NSIntegerのどちらでソートしても変わらなかった


あっかーん!orz




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.