2016-06-20 9 views
8

In this video (Flucht aus dem Elfenbeinturm - The Haskell Journey), Simon Peyton Jones sagt, dass die Herstellung von Haskell Lazy half ihnen mit Ressourcen-Einschränkungen auf den Maschinen, die sie zu der Zeit hatten. Es führte auch zu einer ganzen Reihe anderer Vorteile mit Faulheit.Warum hat sich Haskells Faulheit auf die Leistung ausgewirkt?

Dann sagte er, dass die Herausforderung, die sie jetzt haben, ist, dass Faulheit sich auf die Leistung auswirkt.

Meine Frage ist: Warum machte Haskell faul einen Einfluss auf die Leistung?

+2

https://wiki.haskell.org/Foldr_Foldl_Foldl 'sollte Ihnen einige Einblicke geben – Bergi

+0

Faulheit bedeutet zusätzliche Berechnung und Speicherverwaltung. Sehen Sie sich https://wiki.haskell.org/Performance/Data_types und https://wiki.haskell.org/Performance/Strictness an – zigazou

Antwort

10

Wenn Sie das Ergebnis von etwas nicht verwenden möchten, dann ist es effizienter, es zu speichern und dann nie auszuführen, als es nutzlos auszuführen. So viel ist sofort offensichtlich.

Wenn Sie jedoch sind gehen, um es auszuführen, dann es faul speichern und dann später ausführen ist weniger effizient als nur es jetzt ausführen. Es ist mehr Indirektion beteiligt. Es braucht Zeit, um alle Details zu notieren, die Sie für die Ausführung benötigen, und es braucht Zeit, sie alle zurück zu laden, wenn Sie merken, dass Sie tatsächlich ausgeführt werden müssen.

Dies ist vor allem der Fall, wenn zwei maschinenbreite Integer hinzugefügt werden. Wenn sich Ihre Operanden bereits in CPU-Registern befinden, ist das Hinzufügen derselben sofort ein einzelner Maschinenbefehl. Stattdessen legen wir das ganze Zeug mühsam auf den Haufen und holen es später wieder zurück (möglicherweise mit einer Menge Cache-Misses und Pipeline-Staus).

Obendrein ist manchmal eine Berechnung nicht so teuer und erzeugt ein kleines Ergebnis, aber die Details, die wir speichern müssen, um die Berechnung später auszuführen, sind ziemlich groß. Das kanonische Beispiel besteht darin, eine Liste zusammenzufassen. Das Ergebnis könnte eine einzelne 32-Bit-Ganzzahl sein, aber die zu summierende Liste könnte riesig sein! All diese zusätzliche Arbeit für den Garbage Collector, um diese Daten zu verwalten, die andernfalls tot sein könnten, Objekte, die freigegeben werden könnten.

Im Allgemeinen verwendet Faulheit Recht in massiven Leistungssteigerungen zur Folge haben kann, aber Faulheit verwendet falsch Ergebnisse in erschreckende Leistung Katastrophen. Und Faulheit kann sehr schwierig sein, darüber nachzudenken; dieses Zeug ist nicht einfach. Mit Erfahrung gewöhnt man sich aber allmählich daran.

Verwandte Themen