2016-06-20 31 views
8

W: this video (Escape from the Ivory Tower - The Haskell Journey), Simon Peyton Jones mówi, że tworzenie Haskell Lazy pomogło im z ograniczeniami zasobów na maszynach, które posiadali w tym czasie. Doprowadziło to również do wielu innych korzyści związanych z lenistwem.Dlaczego lenistwo Haskella miało wpływ na wydajność?

Następnie powiedział, że wyzwaniem, jakie mają teraz, jest to, że lenistwo wpływa na wydajność.

Moje pytanie brzmi: Dlaczego lenistwo Haskella miało wpływ na wydajność?

+2

https://wiki.haskell.org/Foldr_Foldl_Foldl 'powinien dać ci pewien wgląd – Bergi

+0

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

Odpowiedz

10

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.