Beispiel für Leistungseinbußen aufgrund der Verwendung von strikten Datenkonstruktoren

8

Ich lese über strikte Datenkonstruktoren . Der verlinkte Wiki-Artikel besagt, dass

  

"Strictness-Annotationen können die Leistung verschlechtern [weil] eine Strictness-Annotation den Compiler zwingt, sicherzustellen, dass das Feld vor dem Konstruieren des Konstruktors vollständig ausgewertet wird, und wenn sich herausstellt, dass das Feld bereits evaluiert wurde, ist dies nur verschwendete Arbeit" .

Ich verstehe nicht, warum, wenn das Feld bereits ausgewertet wurde, es verschwendete Arbeit ist, da sein Wert sowieso benötigt wird, um den Konstruktor anzuwenden.

Gibt es ein Beispiel, das dieses Problem oder andere Effizienzverluste aufgrund von Strenge veranschaulicht?

    
Damian Nadales 12.01.2017, 21:25
quelle

1 Antwort

8

Das Erzwingen eines Werts hat, selbst wenn er bereits ausgewertet wird, geringe, aber bestehende Kosten.

Wenn Sie einen Zeiger auf etwas haben, das möglicherweise bereits ausgewertet wurde (ein Thunk oder ein Wert), und Sie es in einen Lazy-Datenkonstruktor umbrechen, kopieren Sie diese Adresse einfach an ihren Platz im Speicher. Das ist schnell.

Wenn Sie einen solchen Zeiger haben und ihn in einem strikten Konstruktor speichern wollen, müssen Sie ihn zuerst auswerten. Dazu müssen die untersten Bits des Zeigers auf mögliche Tags überprüft werden (ein Trick, um die Bewertung anzuzeigen). Wenn kein Tag vorhanden ist, springen Sie tatsächlich zu diesem Zeiger, um den Thunk einzugeben . Bevor Sie das tun, müssen Sie einen return frame auf den Stapel schieben, damit der Ausführungsfluss am Ende zu Ihnen zurückkehrt. Dann wertet der Thunk sich selbst aus, legt das Ergebnis in ein Register und springt zur Rückgabeadresse. Dann können Sie dieses Ergebnis speichern.

Auch wenn das Objekt, auf das Sie zeigen, bereits ausgewertet wurde, müssen Sie noch die Tag-Überprüfung durchführen. Und ich glaube, dass in einigen Fällen ausgewertete Dinge kein Tag haben (es ist optional), so dass die ganze andere Arbeit immer noch passieren kann - für nichts.

    
Joachim Breitner 12.01.2017, 21:34
quelle

Tags und Links