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];
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];
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.
upvote .. do zobaczenia funkcji KVC, o której zapomniałem – Andrea
bardzo mile widziane :-) –
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
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 .
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.
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
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
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. –
Dlaczego sam nie spróbujesz? Powinien być łatwy do zbadania ... Osobiście chciałbym pójść z rozwiązaniem, które jest bardziej czytelne. –
rzecz Kvc jest znacznie bardziej czytelna, ale szybsze wyliczanie jest szybsze. Ale teraz nie mam czasu na testowanie ... :( –