2013-05-02 10 views
13

Welche der folgenden ist schneller und warum?KVC vs schnelle Aufzählung

CGFloat sum = 0; 
for (UIView *v in self.subviews) 
    sum += v.frame.size.height; 

oder

CGFloat sum = [[self.subviews valueForKeyPath:@"@sum.frame.size.height"] floatValue]; 
+0

Ich bezweifle, dass Sie einen signifikanten Unterschied für weniger als 100 Untersichten bemerken werden. Für große Arrays habe ich einen ähnlichen Vergleich hier gemacht: http://StackOverflow.com/a/15931719/1187415, wo sich die schnelle Aufzählung als die schnellste herausgestellt hat. –

+3

Warum versuchst du es nicht selbst? Sollte leicht zu untersuchen sein ... Persönlich würde ich mit der Lösung gehen, die lesbarer ist. –

+0

die kvc-sache ist viel besser lesbar, aber es ist die schnelle aufzählung ist schneller ich werde damit gehen. Aber im Moment habe ich keine Zeit zu testen ... :( –

Antwort

12

Wirklich, eine Menge, wie elegant (oder klug) ist eine Sprache kommt darauf an, wie gut es vermeidet Schleifen. für, während; sogar schnelle Aufzählung Ausdrücke sind ein Widerstand. Ganz gleich, wie sehr Sie sie beschönigen, Schleifen sind ein Code-Block, der etwas einfacher in natürlicher Sprache zu beschreiben ist.

„hol mir das durchschnittliche Gehalt aller Mitarbeiter in diesem Array“,

double totalSalary = 0.0; 
for (Employee *employee in employees) { 
    totalSalary += [employee.salary doubleValue]; 
} 
double averageSalary = totalSalary/[employees count]; 

gegen ...

Glücklicherweise Schlüsselwert Codierung gibt uns eine viel concise-- fast Rubin-like - Art und Weise, dies zu tun:

[employees valueForKeyPath:@"@avg.salary"]; 

KVC Sammlung Operatoren ermöglichen Aktionen auf einer Sammlung mit Schlüsselpfad Notat durchgeführt werden Ionen in valueForKeyPath:.

Jedes Mal, wenn Sie @ in einem Schlüsselpfad sehen, bezeichnet es eine bestimmte Aggregatfunktion, deren Ergebnis wie jeder andere Schlüsselpfad zurückgegeben oder verkettet werden kann.

Schnelle Aufzählung ist schneller als KVC.

Ich hoffe, es hilft Ihnen.

+3

upvote..für wieder sehen KVC-Funktion, die ich vergaß – Andrea

+0

herzlich willkommen :-) –

+1

Mit KVC für solche Aufgaben führt Fragilität in Ihre Codebasis. Insbesondere kann der Compiler den KVC-Ausdruck nicht validieren, so dass ein potentieller Fehler von der Kompilierzeit bis zur Fehlfunktion zur Laufzeit nicht erkannt wird, wenn dieser Codepath gerade ausgeführt wird. Außerdem ist der gesamte erste Absatz eine Meinung, die der Antwort nichts hinzufügt. – bbum

0

haben Sie auch einen Blick in den Apple-docs:

Obwohl Schlüssel-Wert-Codierung effizient ist, fügt ein Dereferenzierungsebene , die etwas langsamer als direkte Methode Anrufungen ist. Sie sollten Schlüssel-Wert-Codierung nur verwenden, wenn Sie von der Flexibilität profitieren können, die bietet.

Key Value Coding Docs

6

Zuerst Ihre KVC Ausdruck wird nicht funktionieren; KVC kann nicht zum Abrufen von Strukturelementen verwendet werden (außer in sehr begrenzten Fällen, in denen eine Klasse über eine spezielle Implementierung von valueForKey: verfügt, die eine spezielle Verarbeitung durchführt).

Zweitens riecht das wie vorzeitige Optimierung.

Haben Sie tatsächlich ein Leistungsproblem im Zusammenhang mit diesem Code quantifiziert?

Wenn nicht, verschwenden Sie Ihre Zeit, diesen Codepfad "zu optimieren".

Abgesehen davon, die Verwendung von KVC für solche Operationen fügt Ihrem Code erhebliche Fragilität hinzu. Der Compiler kann den an valueForKey: übergebenen Ausdruck nicht verifizieren und somit wäre ein Kompilierzeitfehler oder eine Warnung jetzt ein Fehler zur Laufzeit, der nur gefunden wird, wenn Sie diesen Codepath ausführen.

+0

Alle KVC-Ausdrücke können vom Compiler nicht verifiziert werden. Bedeutet das, dass wir KVC benutzen sollten, wenn wir andere Dinge nicht benutzen können? – samir

+0

Im Allgemeinen ja. Sicherlich, KVC wird verwendet, aber die Verwendung von KVC, introspektionsbasierte Programmierung, usw. begrenzt ... trägt wesentlich zur Wartbarkeit von Codebasen bei. – bbum

Verwandte Themen