4

現在のNSMutableArrayの代わりにNSMutableDictionaryを使用することを検討しています。これは主にKVC/KVOの理由によるものです。コレクションは、私の描画方法の内側のループ内で大きな変化を起こします。この交換を進めると、パフォーマンスが大幅に低下することが予想されますか?

乾杯、ダグ

4

3 に答える 3

6

確認する唯一の方法は、測定することです。NSMutableDictionaryとNSMutableArrayの実装がどのように機能するかについて十分な知識を持っている人はいないので、質問する意味はほとんどありません。

確かに、辞書は単純な配列では実行できない追加のハッシュを実行する必要があるため、おそらくある程度のヒットが予想されます。それが「重要」であるかどうかはわかりません。

繰り返しますが、を測定します。

于 2009-07-08T14:16:30.690 に答える
4

彼らが言うように、あなたはこれらのものをテストする必要があります。しかし...次の簡単なテストは、小さいサイズの高い割り当て率の例の場合のNSMutableDictionaryコレクションクラスとNSMutableArrayコレクションクラスの速度の相対的な違いを理解するのに役立ちました。

次のプログラムを実行した時間は次のとおりです。(ガベージコレクションがオンの場合)(最近のクアッドコアマシンで)

NSMutableDictionary4.624478秒NSMutableArray1.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;
}

(私が思うに絶対時間はそれほど重要ではないと思います。これらの小さなサイズのクラスにとってより重要なのは相対的な時間だけです。もちろん、大きなサイズのクラスの場合、コレクションクラスの性質が支配的になります。たとえば、NSMutableDictionaryはOである必要があります。 (1)要素などを見つける...)

于 2010-07-06T18:06:55.400 に答える
0

「主にKVC/KVOの理由で」と言うとき、詳しく説明していただけますか?

重いミューテーションの下で過剰なKVOの起動が原因でパフォーマンスの問題が発生した場合は、完了したら自分でKVO通知を起動することを検討してください。

[self willChangeValueForKey: @"myArray"];

// loop and mutate

[self didChangeValueForKey: @"myArray"];
于 2009-07-08T15:16:18.207 に答える