2012-04-06 9 views
1

Gibt es einen Unterschied in der Geschwindigkeit zwischen den beiden folgenden Fällen:NSUserDefaults Leistungsvergleich

A:

userName=[[NSUserDefaults standardUserDefaults] objectForKey:@"userName"]; 
userEmail=[[NSUserDefaults standardUserDefaults] objectForKey:@"userEmail"]; 
userId=[[[NSUserDefaults standardUserDefaults] objectForKey:@"userId"] intValue]; 

B:

userDictionary=[[NSUserDefaults standardUserDefaults] objectForKey:@"userDictionary"]; 
userName=[userDictionary objectForKey:@"name"]; 
userEmail=...etc... 

Auch wenn Unterschiede in der Geschwindigkeit könnte extrem klein sein, technisch, gibt es Leistungsunterschiede?

+0

Was haben Ihre Leistungstests angezeigt? (Die Antwort, BTW, ist in der Regel ja, aber es gibt keine solche Anforderung. Der Compiler könnte es legal optimieren, wenn es gewählt wurde. Nur Tests werden Ihnen den Unterschied sagen.) –

+0

Wie mache ich Performance-Tests? (Ich wollte auch das "Warum" kennen und nicht nur ein Ja oder Nein, das ich nicht beantworten kann) – Snowman

+0

Indem ich eine Schleife einfüge und sie millionenfach oder so ablaufe und zeitlich stimme. Was "warum" betrifft, fordert die erste eine Methode mehrmals an, was teurer ist, als diese Methode nicht aufzurufen. Der Compiler darf das optimieren. Clang kann es nicht wirklich optimieren, weil es nicht weiß, dass Sie 'standardUserDefaults' nicht durch eine Methode mit Nebeneffekten zur Laufzeit ersetzt haben. In der Praxis kann es also nicht wirklich optimiert werden und Sie müssen die Anrufe tätigen. Aber das ist in der Regel der falsche Ansatz für Leistungsfragen. Beginnen Sie immer mit Tests. –

Antwort

4

C ist am schnellsten.

C:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
userName=[defaults objectForKey:@"userName"]; 
userEmail=[defaults objectForKey:@"userEmail"]; 
userId=[[defaults objectForKey:@"userId"] intValue]; 

Es macht keinen Sinn die gleiche Methode immer und immer wieder aufrufen, wenn Sie das Ergebnis lokal zwischenspeichern können und es wieder verwenden. Ein Methodenaufruf wird immer langsamer sein als der Zugriff auf eine lokale Variable.

+1

Obwohl * wahrscheinlich * schneller, ist es nicht garantiert. '- [NSUserDefaults objectForKey:]' könnte andere (schlechtere) Leistungsmerkmale als '- [NSDictionary objectForKey:]' haben. –

+0

Oh warte so [defaults objectForKey .. "] ist nicht dasselbe wie [NSUserDefaults standardUserDefaults]? Wusste nicht, dass .. – Snowman

+0

@mohabitar' [NSUserDefaults standardUserDefaults] 'gibt eine Instanz der Klasse' NSUserDefaults'. Diese Tatsache ermöglicht Sie können das Ergebnis in eine lokale Variable zwischenspeichern, und der Zugriff auf diese lokale Variable wird _immer_ schneller sein als das Aufrufen einer Methode, um den gleichen Wert zu erhalten. –

1

Technisch, ja. Aber es wäre eher unklug, darüber zu spekulieren, welches schneller ist. Eine First-Pass-Rate könnte sein, dass A schneller ist, weil es nur drei Lookups in einer Hash-Tabelle statt vier tut. Aber vielleicht verwendet +[NSUserDefaults standardUserDefaults] eine Sperre, um sich threadsicher zu machen, und vielleicht reicht dieser Overhead aus, um schneller zu machen. Als Bonus könnte einer für eine Version von iOS schneller sein, während der andere für einen anderen schneller sein könnte.

Der Unterschied ist unvorhersehbar und unglaublich vernachlässigbar. Verwenden Sie, was immer den Code einfacher macht.

+0

von einem algorithmischen und großen Umfang, das ist eine wirklich schreckliche Antwort. – Katushai