Jeśli nie zamierzacie używać rezultatu czegoś, to przechowywanie go leniwie, a następnie nigdy go nie wykonuje, jest bardziej wydajne niż bezużyteczne wykonywanie tego. Tyle jest od razu oczywiste.
Jeśli jednak wykonasz , to zapisanie go leniwie, a następnie wykonanie go później, będzie mniej skuteczne niż po prostu wykonanie go teraz. W grę wchodzi więcej pośrednictwa. Potrzeba czasu, aby zanotować wszystkie szczegóły potrzebne do wykonania, a to zajmuje trochę czasu, aby je wszystkie z powrotem, gdy zdasz sobie sprawę, że rzeczywiście trzeba wykonać.
Jest tak w szczególności w przypadku dodawania dwóch liczb całkowitych o szerokości maszyny. Jeśli twoje operandy znajdują się już w rejestrach procesora, to ich natychmiastowe dodanie jest pojedynczą instrukcją maszyny. Zamiast tego mozolnie umieszczamy wszystkie te rzeczy na stercie, a następnie je odkładamy później (prawdopodobnie z kilkoma pomyłkami w skrzyni i stacjami rurociągowymi).
Co więcej, czasami obliczenia nie są wcale takie drogie i dają niewielki wynik, ale szczegóły, które musimy zapisać, aby przeprowadzić obliczenia później, są dość duże. Przykład kanoniczny podsumowuje listę. Wynik może być pojedynczą 32-bitową liczbą całkowitą, ale lista do zsumowania może być ogromna! Cała ta dodatkowa praca dla garbage collectora, aby zarządzać tymi danymi, które w przeciwnym razie byłyby martwymi przedmiotami, które można by zwolnić.
Ogólnie lenistwo wykorzystywane prawo może spowodować ogromne zyski wydajności, ale lenistwo wykorzystywane niewłaściwych wyniki w przerażających katastrof wydajności. I lenistwo może być bardzo trudne do zrozumienia; te rzeczy nie są łatwe. Z doświadczeniem stopniowo przyzwyczajasz się do tego.
https://wiki.haskell.org/Foldr_Foldl_Foldl 'powinien dać ci pewien wgląd – Bergi
Lazyness oznacza dodatkowe obliczenia i zarządzanie pamięcią. Zajrzyj na https://wiki.haskell.org/Performance/Data_types i https://wiki.haskell.org/Performance/Strictness – zigazou