Istnieje tutaj założenie, że najskuteczniejszy sposób wykonania wielu czynności „Czy tablica zawiera X?” Sprawdzenie polega na przekonwertowaniu tablicy na skrót. Wydajność zależy od rzadkich zasobów, często czasu, ale czasami przestrzeni, a czasami wysiłku programisty. Przynajmniej podwajasz ilość zajętej pamięci, przechowując jednocześnie listę i skrót listy. Poza tym piszesz bardziej oryginalny kod, który będziesz musiał przetestować, udokumentować itp.
Jako alternatywę, spojrzeć na module Lista :: MoreUtils, w szczególności funkcji any()
, none()
, true()
i false()
. Wszystkie przyjmują blok jako warunek i listę jako argument, podobnie jak map()
i grep()
:
print "At least one value undefined" if any { !defined($_) } @list;
Przeprowadziłem szybki test, ładując połowę / usr / share / dict / words do tablicy (25000 słów), a następnie wyszukując jedenaście słów wybranych z całego słownika (co 5000-te słowo) w tablicy, używając zarówno tablicy -to-hash i any()
funkcja z List :: MoreUtils.
W Perlu 5.8.8 zbudowanym ze źródeł metoda tablica do skrótu działa prawie 1100 razy szybciej niż any()
metoda (1300 razy szybciej w pakiecie Perl 5.8.7 z Ubuntu 6.06).
Nie jest to jednak pełna historia - konwersja tablicy na skrót zajmuje około 0,04 sekundy, co w tym przypadku zabija wydajność czasową metody tablica do skrótu do 1,5x-2x szybciej niż any()
metoda. Wciąż dobry, ale nie tak gwiezdny.
Moje przeczucie jest takie, że metoda tablic-to-hash będzie any()
lepsza w większości przypadków, ale czułbym się o wiele lepiej, gdybym miał bardziej solidne metryki (wiele przypadków testowych, przyzwoite analizy statystyczne, może niektóre duże O algorytmiczna analiza każdej metody itp.) W zależności od potrzeb List :: MoreUtils może być lepszym rozwiązaniem; jest z pewnością bardziej elastyczny i wymaga mniej kodowania. Pamiętaj, przedwczesna optymalizacja to grzech ... :)