2013-05-02 18 views
13

Które z poniższych jest szybsze i dlaczego?KVC a szybkie wyliczenie

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

lub

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

Wątpię, że zauważysz znaczącą różnicę dla mniej niż 100 subviews. W przypadku dużych tablic dokonałem podobnego porównania tutaj: http://stackoverflow.com/a/15931719/1187415, gdzie szybkie wyliczenie okazało się najszybsze. –

+3

Dlaczego sam nie spróbujesz? Powinien być łatwy do zbadania ... Osobiście chciałbym pójść z rozwiązaniem, które jest bardziej czytelne. –

+0

rzecz Kvc jest znacznie bardziej czytelna, ale szybsze wyliczanie jest szybsze. Ale teraz nie mam czasu na testowanie ... :( –

Odpowiedz

12

Naprawdę, dużo jak elegancki (lub mądry) język to sprowadza się do tego, jak dobrze unika pętle. przez chwilę; nawet szybkie wyliczenie wyrażeń są przeciągnij. Bez względu na to, jak je posmarujesz, pętle będą blokiem kodu, który robi coś prostszego do opisania w języku naturalnym.

„daj mi przeciętnego wynagrodzenia wszystkich pracowników w tej tablicy”

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

kontra ...

szczęście Key-Value Coding daje nam znacznie więcej concise-- prawie-jak Ruby - sposób, aby to zrobić:

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

KVC Collection Operatorzy pozwala akcje wykonywane na zbiorze przyciskiem Notat ścieżki jon w valueForKeyPath:.

Za każdym razem, gdy widzisz w ścieżce klucza @, oznacza ona konkretną funkcję agregującą, której wynik można zwrócić lub powiązać, tak jak każdą inną ścieżkę klucza.

Szybkie wyliczanie jest szybsze niż KVC.

Mam nadzieję, że to pomoże.

+3

upvote .. do zobaczenia funkcji KVC, o której zapomniałem – Andrea

+0

bardzo mile widziane :-) –

+1

Używanie KVC do takich zadań wprowadza kruchość do twojej bazy kodów. Konkretnie, kompilator nie może sprawdzić poprawności wyrażenia KVC, w ten sposób przesuwając potencjalny błąd z wykrycia w czasie kompilacji na niepowodzenie w czasie działania, jeśli ta ścieżka kodowa zostanie wykonana. Jak również, cały pierwszy akapit to opinia, która nie dodaje nic do odpowiedzi. – bbum

0

Również spojrzeć w docs Apple:

Chociaż kodowanie klucz-wartość jest skuteczny, to dodaje poziom zadnie czyli nieznacznie wolniej niż bezpośrednie wywołanie metody. Powinieneś używać kodowania wartości klucz-wartość tylko wtedy, gdy możesz skorzystać z elastyczności, którą zapewnia .

Key Value Coding Docs

6

Po pierwsze, wyrażenie KVC nie będzie działać; KVC nie może być użyty do pobrania elementów konstrukcyjnych (z wyjątkiem bardzo ograniczonych przypadków, gdy klasa ma specjalną implementację valueForKey:, która wykonuje specjalne przetwarzanie).

Po drugie, to pachnie jak przedwczesna optymalizacja.

Czy rzeczywiście określono ilościowo problem z wydajnością związany z tym kodem?

Jeśli nie, tracisz czas "optymalizując" tę ścieżkę kodu.

Oprócz tego, używanie KVC do takich operacji zwiększa kruchość twojego kodu. Kompilator nie może zweryfikować wyrażenia przekazanego do valueForKey:, a zatem to, co byłoby błędem czasu kompilacji lub ostrzeżeniem, jest teraz błędem w czasie wykonywania, który zostanie znaleziony tylko po wykonaniu tej ścieżki kodowej.

+0

Nie można zweryfikować wszystkich wyrażeń KVC przez kompilator. oznacza to, że powinniśmy używać KVC, jeśli nie możemy używać innych rzeczy? – samir

+0

Ogólnie, tak. Oczywiście, KVC używa, ale ograniczające użycie KVC, programowanie oparte na introspekcji itp. ... przyczynia się w dużym stopniu do łatwości obsługi kodu. – bbum