現在のNSMutableArrayの代わりにNSMutableDictionaryを使用することを検討しています。これは主にKVC/KVOの理由によるものです。コレクションは、私の描画メソッドの内側のループ内で重度の変異を受けます。この代替品を先に進めれば、大幅なパフォーマンス低下が予想されますか?NSMutableDictionaryとNSMutableArrayを使用してパフォーマンスが低下する>
乾杯は、 ダグ
現在のNSMutableArrayの代わりにNSMutableDictionaryを使用することを検討しています。これは主にKVC/KVOの理由によるものです。コレクションは、私の描画メソッドの内側のループ内で重度の変異を受けます。この代替品を先に進めれば、大幅なパフォーマンス低下が予想されますか?NSMutableDictionaryとNSMutableArrayを使用してパフォーマンスが低下する>
乾杯は、 ダグ
確認する唯一の方法は、測定することです。私たちの誰もNSMutableDictionaryとNSMutableArrayの実装がどのように機能するかについて十分な知識を持っていないので、少し質問しています。
辞書は単純な配列ではできない追加のハッシングを行う必要があるため、多少のヒットが予想されます。それが「重要」であるかどうかは、言うまでもありません。
再び、小節。
「主にKVC/KVOの理由で」と言うときは、詳しく説明できますか?
あなたは設定が完了したら、KVO通知を自分で発射検討し、重い変異の下で焼成過度KVOによるパフォーマンスの問題を見ている場合:
[self willChangeValueForKey: @"myArray"];
// loop and mutate
[self didChangeValueForKey: @"myArray"];
彼らはあなたがこれらの事をテストする必要が言うように。しかし、次の単純なテストは、小さいサイズの高い割り当て率の例の場合、NSMutableDictionaryとNSMutableArrayコレクションクラスの間の相対的な速度差の考え方を私に教えてくれました。 (最近のクアッドコアマシン上)(上のガベージコレクションで)
NSMutableDictionary 4.624478秒 NSMutableArrayの1.806365秒
int main (int argc, const char * argv[])
{
NSLog(@"Hello, World!");
LNCStopwatch* stopwatch = [[LNCStopwatch alloc] init];
[stopwatch start];
for (int i = 1; i< 1000000; i++)
{
NSMutableDictionary* dict = [[NSMutableDictionary alloc]init];
[dict setObject:@"a" forKey:@"a"];
[dict setObject:@"b" forKey:@"b"];
[dict setObject:@"c" forKey:@"c"];
[dict setObject:@"d" forKey:@"d"];
[dict setObject:@"e" forKey:@"e"];
[dict setObject:@"y" forKey:@"a"];
[dict setObject:@"x" forKey:@"d"];
}
[stopwatch stopAndLogTimeAndReset];
[stopwatch start];
for (int i = 1; i< 1000000; i++)
{
NSMutableArray* arr = [[NSMutableArray alloc]init];
[arr addObject:@"a"];
[arr addObject:@"b"];
[arr addObject:@"c"];
[arr addObject:@"d"];
[arr addObject:@"e"];
[arr replaceObjectAtIndex:[arr indexOfObject:@"a"] withObject:@"y"];
[arr replaceObjectAtIndex:[arr indexOfObject:@"d"] withObject:@"x"];
}
[stopwatch stopAndLogTimeAndReset];
return 0;
}
(絶対時間Iドン:時間がなかった、以下のプログラムを実行する
これらの小さなクラスではもっと重要な相対的な時間だと思います。もちろん、より大きなサイズのクラスでは、コレクションクラスの性質が支配的です。たとえば、NSMutableDictionaryはO(1)である必要があります。要素など)
こんにちは、フレーザー、 私は画面の周りにジッピング可能性のある数百のスプライトを持つパーティクルシステムのiPhoneアプリをやっています。レンダリングはOpenGLで行われます。私は笑顔のために、すべてのパーティクルにKVOを使って誕生/死を観察し、アプリをデバイスに取り付けたときにアプリの停止を止めました。 KVOのオーバーヘッドがこのケースでは非常に高価であるため、辞書/配列の問題は実際には関係ありません。 – dugla