Ja tylko nauka Haskell i napisał dwa programy z witryny samouczka, tak żeW Haskell, wydajności i gdzie wiązanie
maximumnowhere :: (Ord a) => [a] -> a
maximumnowhere [] = error "empty"
maximumnowhere [x] = x
maximumnowhere (x:xs) = if x > maximumnowhere xs then x else maximumnowhere xs
i
maximumwhere :: (Ord a) => [a] -> a
maximumwhere [] = error "empty"
maximumwhere [x] = x
maximumwhere (x:xs) = if x > maximum' then x else maximum' where maximum' = maximumwhere xs
Myślałem, te dwa programy są dość równoważne, ponieważ myślałem, że miejsce wiązania tylko zastępuje zmienną zawartością. ale kiedy uruchomiłem go w ghci, pierwszy był znacznie wolniejszy od drugiego, szczególnie w przypadku macierzy o długości powyżej 25 lat. Prawdopodobnie, gdzie powiązanie powoduje ogromną różnicę wydajności, ale nie wiem dlaczego. Czy ktoś może mi to wyjaśnić?
Pierwsza nie podzieli się ocenami "maximumnowhere xs" (używanymi zarówno w przypadku warunkowym, jak i innym) - jeśli chcesz się dzielić, powinieneś zrobić to samemu, jak w drugiej wersji. –
Dodając dalsze informacje, GHC generalnie nie robi wspólnej eliminacji podwyrażeń (co sprawiłoby, że obie wersje wykonują to samo). Dzieje się tak dlatego, że CSE może wprowadzać wycieki przestrzeni w leniwym języku - zobacz FAQ GHC - http://www.haskell.org/haskellwiki/GHC:FAQ#Does_GHC_do_common_subexpression_elimination.3F –
Dlaczego ludzie używają GHCI do pomiarów wydajności? Istnieje kompilator optymalizujący, który możesz przetestować z ... –