私のアプリでは、各ユーザのplistファイルにユーザ設定を保存したいのですが、one class called CCUserSettings
はほとんど同じインタフェースをNSUserDefaults
と書いてあり、現在のユーザIDに関連するplistファイルを読み書きします。それは動作しますが、パフォーマンスが悪いです。ユーザーが[[CCUserSettings sharedUserSettings] synchronize]
と呼ぶたびに、NSMutableDictionary
(ユーザー設定を保持する)をplistファイルに書き込むと、下のコードはCCUserSettings
の簡略な説明を省略してsynchronize
を示しています。「NSUserDefaults synchronize」はどのように高速で動作しますか?
- (BOOL)synchronize {
BOOL r = [_settings writeToFile:_filePath atomically:YES];
return r;
}
私はdemoをテストするために書き、私たちは[[NSUserDefaults standardUserDefaults] synchronize]
を呼び出すときNSUserDefaults
は、ファイルに書き込む必要があると仮定し、それは本当に速く走るには、重要な部分は、以下の私のiPhone6の実行を1000回[[NSUserDefaults standardUserDefaults] synchronize]
と[[CCUserSettings sharedUserSettings] synchronize]
、その結果であります0.45秒対9.16秒である。結果が示すように
NSDate *begin = [NSDate date];
for (NSInteger i = 0; i < 1000; ++i) {
[[NSUserDefaults standardUserDefaults] setBool:(i%2==1) forKey:@"key"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
NSDate *end = [NSDate date];
NSLog(@"synchronize seconds:%f", [end timeIntervalSinceDate:begin]);
[[CCUserSettings sharedUserSettings] loadUserSettingsWithUserId:@"1000"];
NSDate *begin = [NSDate date];
for (NSInteger i = 0; i < 1000; ++i) {
[[CCUserSettings sharedUserSettings] setBool:(i%2==1) forKey:@"_boolKey"];
[[CCUserSettings sharedUserSettings] synchronize];
}
NSDate *end = [NSDate date];
NSLog(@"CCUserSettings modified synchronize seconds:%f", [end timeIntervalSinceDate:begin]);
、NSUserDefaults
は私のCCUserSettings
よりも約20倍高速です。今私は "NSUserDefaultsが本当にsynchronize
メソッドを呼び出すたびにplistファイルに書き込むのですか?"と思っていますが、そうでなければ、プロセスが終了する前にファイルへのデータの書き戻しをどうすれば保証できますか?いつでも殺されるだろう)?
最近、私はCCUserSettings
を改善するアイデアを思いついた、mmap
Memory-mapped I/Oです。私は仮想メモリをファイルにマップすることができ、ユーザがsynchronize
を呼び出すたびにNSPropertyListSerialization dataWithPropertyList:format:options:error:
メソッドを使ってNSData
を作成し、そのメモリにデータをコピーすると、オペレーティングシステムはプロセスが終了するとメモリにファイルを書き戻します。しかし、私はファイルのサイズが固定されていないため、データの長さが増えるたびに、私は仮想メモリをmmap
に再登録しなければならないため、パフォーマンスが良くないかもしれません。
私の冗長な詳細については申し訳ありませんが、私はちょうどNSUserDefaults
がどのように優れた性能を達成するために働いているか知りたいですか、誰かが私のCCUserSettings
を改善する良いアドバイスを持っていますか?
ここではNSUserDefaults' 'についての素晴らしい記事です:http://dscoder.com /defaults.html。その作者はAppleのエンジニアですから、彼が話していることを知っていると想定するのはかなり安全です:) – Losiowaty
@Losiowatyあなたのリンクをありがとうございますが、私はMac oxの実装について話しています。変更がどれほど小さいかにかかわらず、plist全体をディスクに書き出します(つまり、非同期で、後で別のプロセスで時間がかかります)。 "あなたがNSUserDefaultsを修正し、 'synchronize'なしであなたのアプリをkillすると、設定はファイルに書き込まれないので、iOSにファイルを書き込む別のプロセスはないと思います。 – KudoCC
NSUserDefaultsを修正してアプリを終了した場合、データを失うためにはkillボタンで*非常に*高速にする必要があります。数ミリ秒ほどです。これはiOS 8で変更されました。それ以前は、データを失うことがずっと簡単でした。 –