2011-02-07 13 views

Odpowiedz

5

Jest jeden sposób, że bloki mogą być szybciej:

  1. użyć NSEnumerationConcurrent wymienić tablicę.
  2. Po znalezieniu obiektu, który pasuje do twojego warunku, wyślij inny blok do kolejki szeregowej, która dodaje obiekt do tablicy wyników. (Nie można tego robić jednocześnie, ponieważ NSMutableArrays nie są bezpieczne dla wątków.)

Jednak dokumentacja nie mówi jednoznacznie, że zamówienie zostanie zachowane przy jednoczesnym wyliczaniu. Myślę, że to dobrze, że tak nie będzie. Jeśli kolejność macierzy ma znaczenie, musielibyśmy ponownie sortować (jeśli to nawet możliwe) i musielibyśmy to uwzględnić w każdym porównaniu czasowym.

Innymi sposobami są jednoczesne wyliczanie przy użyciu bloków i filtrowanie za pomocą predykatów. filterUsingPredicate: może być szybszy, ponieważ NSArray będzie miał możliwość wykorzystania wewnętrznej wiedzy do zbudowania tablicy wyników szybciej niż powtarzające się wiadomości addObject:. Ale to tylko możliwość; Jedynym sposobem, aby wiedzieć na pewno, byłoby porównanie, a nawet wtedy odpowiedź mogłaby się zmienić w dowolnym momencie (w tym w tym samym procesie, dla różnych tablic wejściowych lub różnych obiektów w tablicy).

Moja rada polegałaby na tym, aby zaimplementować ją w prosty sposób - najpierw za pomocą predykatów, a następnie za pomocą instrumentów sprawdzić, czy jest to problem z wydajnością. Jeśli nie, wyraźny kod wygrywa. Jeśli jest to problem z wydajnością, spróbuj równoległego wyliczenia.

+0

Dziękuję, piszesz ... i mniej kodu do utrzymania = mniej bólu :) – jibay

3

Mówiąc o występie, trudno jest pokonać eksperyment. Moglibyśmy argumentować cały dzień o różnych skutkach związanych z blokami lub jakimkolwiek innym rozwiązaniem, ale najlepiej, gdy mierzy się rzeczywiste dane używane w aplikacji.

+0

Dzięki, zaimplementowałem oba i zobaczę, jak zachowuje się w zależności od złożoności zapytania. Na razie i jedno proste pytanie, zobaczę, jak ewoluuje z czasem. – jibay

Powiązane problemy