Welche Optimierungen können von GHC zuverlässig erwartet werden?

GHC kann viele Optimierungen durchführen, aber ich weiß nicht, was sie alle sind und wie wahrscheinlich und unter welchen Umständen sie durchgeführt werden.

Meine Frage ist: Mit welchen Transformationen kann ich rechnen, dass sie jedes Mal oder fast immer angewendet werden? Wenn ich mir einen Code ansehe, der häufig ausgeführt (ausgewertet) wird, und mein erster Gedanke ist "hmm, vielleicht sollte ich das optimieren", in welchen Fällen mein zweiter Gedanke sein sollte, "denke nicht einmal darüber nach, GHC hat das "?

Ich habe die Zeitung gelesenStream Fusion: Von Listen über Streams bis hin zu gar nichtsund die Technik, mit der sie die Listenverarbeitung in eine andere Form umschreiben, die die normalen Optimierungen von GHC dann zuverlässig in einfache Schleifen umwandeln würden, war für mich neu. Woran erkenne ich, ob meine eigenen Programme für diese Art der Optimierung geeignet sind?

Da ist eseinige Informationen im GHC-Handbuch, aber es ist nur ein Teil des Weges zur Beantwortung der Frage.

EDIT: Ich starte ein Kopfgeld. Was ich möchte, ist eine Liste von Transformationen auf niedrigerer Ebene wie Lambda / Let / Case-Floating, Typ / Konstruktor / Funktionsargument-Spezialisierung, Strenge-Analyse und Unboxing, Worker / Wrapper und was auch immer signifikante GHC-Aktionen sind, die ich ausgelassen habe Zusammen mit Erklärungen und Beispielen für Eingabe- und Ausgabe-Code und idealerweise Darstellungen von Situationen, in denen der Gesamteffekt mehr als die Summe seiner Teile ist. Und im Idealfall einige Erwähnungen bei TransformationenGewohnheit geschehen. Ich erwarte keine neuartigen Erklärungen für jede Transformation, ein paar Sätze und einzeilige Inline-Codebeispiele könnten ausreichen (oder ein Link, wenn es sich nicht um zwanzig Seiten einer wissenschaftlichen Arbeit handelt), solange das Gesamtbild stimmt klar bis zum Ende. Ich möchte in der Lage sein, einen Code zu betrachten und eine gute Vorstellung davon zu bekommen, ob er in einer engen Schleife kompiliert wird oder warum nicht oder was ich ändern müsste, um ihn zu erstellen. (Ich interessiere mich hier nicht so sehr für die großen Optimierungs-Frameworks wie Stream Fusion (ich habe gerade einen Artikel darüber gelesen), sondern mehr für die Art von Wissen, das die Leute habenschreiben diese Frameworks haben.)

Antworten auf die Frage(3)

Ihre Antwort auf die Frage