2015-07-20 12 views
12

Ostatnio gdzieś czytałem, że dopasowywanie wzorców zachodzi podczas wykonywania, a nie podczas kompilacji. (Szukam źródła, ale nie mogę go znaleźć w tej chwili). Czy to prawda? A jeśli tak, czy strażnicy w funkcjach mają taką samą wydajność?Czy dopasowanie wzoru jest bardziej wydajne niż osłony?

Czytanie tego było dla mnie zaskakujące, ponieważ uważałem, że GHC był w stanie zoptymalizować niektóre (prawdopodobnie nie wszystkie) decyzje dotyczące dopasowania wzorca podczas kompilacji. Czy to się dzieje w ogóle?

Przypadek np

f 1 = 3 
f 2 = 4 

vs

f' a | a == 1 = 3 
    | a == 2 = 4 

uwagi f i f' kompilacji do tej samej liczby instrukcji (na przykład w rdzeniu i/lub dolnej)?

Czy sytuacja jest inna, jeśli dopasowuję wzór do konstruktora zamiast wartości? Na przykład. jeśli GHC widzi, że funkcja z lokalizacji jest zawsze wywoływana za pomocą jednego konstruktora, czy optymalizuje to wywołanie w sposób, który eliminuje sprawdzanie w czasie wykonywania? A jeśli tak, to czy możesz podać przykład pokazujący, co daje optymalizacja?

Podsumowując

Co warto wiedzieć o tych dwóch podejść pod względem wydajności?

Kiedy jest jeden preferowany pod względem wydajności?

+4

Pytasz, jak uzyskać podstawowe wyniki GHC lub jak zastosować kryterium? – jberryman

+1

Istotne: [Haskell GHC: jaka jest złożoność czasu dopasowania wzorca z N konstruktorami?] (Http://stackoverflow.com/q/9027384/2751851) – duplode

+0

Zwykle uważam, że dopasowanie do wzorca jest szybsze, biorąc pod uwagę że instancje 'Eq' są zwykle oparte na dopasowywaniu wzorców. – AJFarmar

Odpowiedz

14

Mniejsza liczba wzorów niż ochrona, równie dobrze możesz zapytać o numer if w porównaniu z case.

Dopasowywanie wzorców jest preferowane jako do sprawdzania równości. Sprawdzanie równości nie jest czymś naturalnym w Haskell. Boolean blindness to jeden problem, ale poza tym pełna kontrola równości często jest po prostu niewykonalna, np. – np. nieskończone listy nigdy nie będą porównywać równych!

O wiele bardziej efektywne bezpośrednie dopasowywanie wzorów zależy od typu. W przypadku liczb nie należy oczekiwać dużej różnicy, ponieważ te wzorce są pod maską zaimplementowane z kontrolą równości.

Generalnie wolę wzorce –, ponieważ są po prostu ładniejsze i mogą być bardziej wydajne niż. Kontrola równości będzie albo tak samo kosztowna, albo prawdopodobnie droższa i będzie po prostu nie-idiomatyczna. Używaj wartościowania boolowskiego tylko wtedy, gdy musisz, w przeciwnym razie trzymaj się wzorców (które mogą być również in guards)!