2016-03-26 14 views
3

mir einige App-Optimierungen zu tun und in großen Schleifen werden die Kontrollen NSMutableDictionary die sind ziemlich anstrengend:Schneller Weg für NSMutableDictionary überprüfen

if ([self.variantBufferSequence objectForKey:[variant valueForKey:@"model_no"]] == nil) { 
    [self.variantBufferSequence setObject:[NSMutableDictionary new] forKey:[variant valueForKey:@"model_no"]]; 
} 

Gibt es einen leichten Weg, um die Existenz des Eintrags zu überprüfen (objectForKey) in die if -anweisung?

+1

Haben Sie überprüfen, ob die meiste Zeit in 'objectForKey' ausgegeben wird? – Willeke

+2

Warum ist der Aufruf 'objectForKey:' eher teuer als der 'valueForKey'-Aufruf (der im Allgemeinen der langsamere der beiden ist und extrem langsam sein kann). Was ist "Variante"? Ist dieser Test wahrscheinlich oft wahr? Was haben die Instrumente gesagt, als Sie das Profil erstellt haben? Die isolierte Optimierung einer Codezeile ist selten der richtige Ansatz. Welcher Wert ändert sich in der Schleife? Wie groß ist dieses Wörterbuch? –

Antwort

2

In den letzten Versionen von objc und clang können Sie die Existenz eines Schlüssels in einem Wörterbuch mit einer kompakteren Notation überprüfen.

Dieses kleine Beispiel funktioniert für mich:

NSMutableDictionary *description = @{@"model_no":@"key1"}.mutableCopy; 
NSMutableDictionary *dictionary = @{@"key1":@"value1"}.mutableCopy; 

if(dictionary[description[@"model_no"]]){ 
    NSLog(@"It exists!"); 
} else { 
    NSLog(@"It doesn't exists!"); 
} 

Try key1 mit key2 in description zu ersetzen.

Reference

+0

In meinen Tests ist 'objectForKey:' etwas schneller als Subskribierung (ich vermute, dass 'objectForKeyedSubscript:' als Aufruf von 'objectForKey:' implementiert ist). Ich würde nicht erwarten, dass dies in irgendeiner Weise eine Rolle spielt, aber gibt es irgendeinen Grund, warum Sie glauben, dass dieser Ansatz schneller ist als der Code des OP? (Ignorieren der Entfernung von 'valueForKey:', was nur funktioniert, wenn 'variant' ein Wörterbuch ist.) –

+0

Das hat mir eine sehr kleine Geschwindigkeitsverbesserung gegeben. 'Variante' ist in der Tat ein veränderbares Wörterbuch mit ungefähr 20 kleinen Werten. Ich habe es wiederholt mit dem Time Profiler getestet und habe ca. 5% Gewinn gemacht. Ich hoffte auf etwas spektakuläreres, aber nicht beschweren :) –

Verwandte Themen