In dieses Video (Flucht aus dem Elfenbeinturm - Die Haskell-Reise), Simon Peyton Jones sagt, dass Haskell Lazy ihnen dabei geholfen hat, ihre Maschinen mit Ressourcen zu versorgen. Es führte auch zu einer ganzen Reihe anderer Vorteile mit Faulheit.
Dann sagte er, dass die Herausforderung, die sie jetzt haben, ist, dass Faulheit Auswirkungen auf die Leistung hat.
Meine Frage ist: Warum hat das Haskell-Faulenzen einen Einfluss auf die Leistung?
Wenn Sie das Ergebnis von etwas nicht verwenden möchten, dann ist es effizienter, es faul zu speichern und dann nie auszuführen, als es nutzlos auszuführen. So viel ist sofort offensichtlich.
Wenn Sie jedoch ausführen, ist es weniger effizient, sie später zu speichern und dann später auszuführen, als sie nur jetzt auszufü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 Integer mit Maschinenbreite 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-Blockaden).
Außerdem ist eine Berechnung manchmal 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 sehr groß sein! All diese zusätzliche Arbeit für den Garbage Collector, um diese Daten zu verwalten, die andernfalls tote Objekte sein könnten, die freigegeben werden könnten.
Im Allgemeinen kann Faulheit, die richtig verwendet wird, zu massiven Leistungssteigerungen führen, aber Faulheit, die falsch verwendet wird, führt zu entsetzlichen Performance-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.
Tags und Links haskell performance lazy-evaluation