Filtrowanie tablicy w Objective-C. Porównanie prędkości 4 metod.

W wielu aplikacjach mobilnych istnieje potrzeba przeszukania tablicy z danymi i wybrania pewnego zbioru spełniającego zdefiniwoane kryteria. W języku Objective-C na iOS SDK mamy do dyspozycji kilka różnych metod, aby osiągnąć ten cel. Ich rezultat jest identyczny, różnica (zasadnicza) polega na prędkości działania tych metod. Tworząc kod w odpowiedni sposób, możemy osiągnąć wynik ponad 2 razy szybciej niż w przypadku najwolniejszej metody.  Zapraszam do zapoznania się ze szczegółami.

Materiał do tego posta pochodzi z http://stackoverflow.com/a/21158730/978538.

Przeszukując tablicę, mamy do dyspozycji:

  • predykat tekstowy (predicateWithFormat)
  • predykat z blokiem kodu (predicateWithBlock)
  • pobranie indeksów zdających test (indexesOfObjectsPassingTest)
  • iteracja po pętli z wykorzystaniem if i NSMutableArray do przechowywania wyniku

Wyniki (czas) jaki dostaniemy w testach opisanych w linku danym wyżej, to:

8.514334 (predicateWithFormat)
4.422550 (predicateWithBlock)
5.170086 (indexesOfObjectsPassingTest)
3.154015 (fast-enumeration + mutable array)

Konkretne wartości nie mają tutaj znaczenia. Popatrzcie na to z perspektywy użytkownika aplikacji mobilnej: Zejście z czasem reakcji aplikacji na działania użytkownika z 1 sekundy do 0.5 sekundy jest bardzo dobrze widoczne w aplikacji i znacząco usprawnia UX. Jeśli takich operacji do wykonania jest więcej niż 1, to otrzymany zysk jest szczególnie ważny.

Ja  osobiście lubię wykorzystywać predykaty do takiego filtrowania, bo dużo prościej utrzymuje się taki kod. Jest on bardziej czytelny niż iteracja w pętli i jakiś rozbudowany warunek IF. Ale jak widać powyżej – warto czasem pomyśleć, czy daną operację lepiej zapisać mniej czytelnym kodem z komentarzami, ale za to szybszym, niż ładny predykat, ale dużo wolniejszy.

Jedno przemyślenie nt. „Filtrowanie tablicy w Objective-C. Porównanie prędkości 4 metod.”

Dodaj komentarz