4

Ich erwäge, ein NSMutableDictionary anstelle meines aktuellen NSMutableArray zu verwenden. Dies ist hauptsächlich für KVC/KVO-Gründe. Die Sammlung wird schwere Mutationen innerhalb der inneren Schleife meiner Zeichnungsmethode erfahren. Kann ich erwarten, dass ich einen signifikanten Leistungseinbruch erleiden werde, wenn ich mit diesem Ersatz fortfahre?Leistungseinbußen bei der Verwendung von NSMutableDictionary vs. NSMutableArray>

Cheers, Doug

Antwort

6

Der einzige Weg, um sicher zu sein ist zu messen. Keiner von uns hat genug Wissen darüber, wie die Implementierungen von NSMutableDictionary und NSMutableArray funktionieren, daher ist es wenig sinnvoll zu fragen.

Zugegeben, Sie könnten wahrscheinlich einen Treffer erwarten, da das Wörterbuch zusätzliche Hashing-Operationen durchführen muss, die ein einfaches Array nicht tun würde. Ob das "signifikant" ist oder nicht, ist schwer zu sagen.

Wieder messen.

0

Wenn Sie "in erster Linie für KVC/KVO-Gründe" sagen, können Sie das ausarbeiten?

Wenn Sie Performance-Probleme aufgrund einer übermäßigen KVO sind zu sehen unter schweren Mutation Brennen, betrachten die KVO-Benachrichtigungen selbst feuern, sobald Sie fertig sind:

[self willChangeValueForKey: @"myArray"]; 

// loop and mutate 

[self didChangeValueForKey: @"myArray"]; 
+1

Hallo Fraser, Ich mache ein Partikelsystem iPhone App mit möglicherweise Hunderte von Sprites auf dem Bildschirm zippen. Das Rendern erfolgt in OpenGL. Für Grinsen nutze ich KVO für jedes Partikel, um ihre Geburt/Tod zu beobachten und die App stoppte, als ich sie auf dem Gerät installierte. Das Wörterbuch/Array-Problem ist nicht mehr wirklich relevant, da KVO Overhead in diesem Fall unerschwinglich teuer ist. – dugla

4

Wie sie sagen Sie, diese Dinge testen müssen. Aber ... der folgende einfache Test war für mich lehrreich, um eine Vorstellung von dem relativen Geschwindigkeitsunterschied zwischen den NSMutableDictionary- und NSMutableArray-Auflistungsklassen im Falle kleiner Beispiele mit hoher Belegungsrate zu bekommen.

das folgende Programms Ausführen der Zeit war: (mit Garbage Collection on) (auf einer neuen Maschine quad core)

NSMutableDictionary 4,624478 Sekunden lang NSMutableArray 1,806365 Sekunden lang

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; 
} 

(Die absoluten Zeiten I don Ich denke, es ist wirklich alles so wichtig, es sind nur die relativen Zeiten, die für diese kleinen Klassen wichtiger sind.Für größere Klassen wird natürlich die Art der Sammelklasse dominieren, zB sollte NSMutableDictionary O (1) sein Element, etc ...)

Verwandte Themen