DDP arbeitet standardmäßig mit Value-Types, will heißen im folgenden code Beispiel wird jeder der Wert der Variable a kopiert, nicht nur die Referenz und es wird neuer Speicher für b allokiert:
Der Text a ist "hallo".
Der Text b ist a.
Das ist an sich kein sonderliches Problem, allerdings führt es in manchen Fällen zu performance Problemen und diese zu lösen kann recht unschön sein. Die häufigsten Beispiele dafür finden sich im Duden.
Alle Funktionen im Duden sollten zumindest angemessen Performant sein. Das führt häufig zu folgendem Code:
Die Funktion foo mit dem Parameter a vom Typ Text Referenz, gibt einen Text zurück, macht:
Gib a verkettet mit " foo!" zurück
Und kann so benutzt werden:
"foo <a>"
Die Funktion foo mit dem Parameter a vom Typ Text, gibt einen Text zurück, macht:
Gib foo a zurück.
Und kann so benutzt werden:
"foo <a>"
Dieses Vorgehen sorgt dafür, dass sehr große Texte, die an foo übergeben werden nicht unnötig kopiert werden. Das ist möglich, da foo seinen Parameter nicht verändert.
Für den Duden fände ich dieses Vorgehen akzeptabel, da er Code vom Endnutzer nicht verändert wird.
Allerdings ist es sehr nervig zu Schreiben und viel wichtiger:
Man sollte DDP der lesbarkeit wegen schreiben, nicht wegen der Performance. Im best-case ist also der lesbarste code gleichzeitig der performanteste. Das ist natürlich nicht immer zu erreichen, aber sollte ein Ziel sein.
Vorschlag
Copy-on-Write wäre eine gute Art die Performance zu erhöhen ohne sich im Code groß damit beschäftigen zu müssen. Das beste: Es wäre ein reines Implementation-detail. Kein DDP Code müsste verändert werden, aber der gesamte existierende Code würde davon profitieren.
In DDP hieße das, dass jeder komplexe Typ (außer Zahl, Kommazahl, Wahrheitswert und Buchstabe) zu einem "CoW"-Typ wird und erst on-write kopiert wird.
Motivation
DDP arbeitet standardmäßig mit Value-Types, will heißen im folgenden code Beispiel wird jeder der Wert der Variable a kopiert, nicht nur die Referenz und es wird neuer Speicher für b allokiert:
Das ist an sich kein sonderliches Problem, allerdings führt es in manchen Fällen zu performance Problemen und diese zu lösen kann recht unschön sein. Die häufigsten Beispiele dafür finden sich im Duden.
Alle Funktionen im Duden sollten zumindest angemessen Performant sein. Das führt häufig zu folgendem Code:
Dieses Vorgehen sorgt dafür, dass sehr große Texte, die an
foo
übergeben werden nicht unnötig kopiert werden. Das ist möglich, dafoo
seinen Parameter nicht verändert.Für den Duden fände ich dieses Vorgehen akzeptabel, da er Code vom Endnutzer nicht verändert wird. Allerdings ist es sehr nervig zu Schreiben und viel wichtiger: Man sollte DDP der lesbarkeit wegen schreiben, nicht wegen der Performance. Im best-case ist also der lesbarste code gleichzeitig der performanteste. Das ist natürlich nicht immer zu erreichen, aber sollte ein Ziel sein.
Vorschlag
Copy-on-Write wäre eine gute Art die Performance zu erhöhen ohne sich im Code groß damit beschäftigen zu müssen. Das beste: Es wäre ein reines Implementation-detail. Kein DDP Code müsste verändert werden, aber der gesamte existierende Code würde davon profitieren.
In DDP hieße das, dass jeder komplexe Typ (außer Zahl, Kommazahl, Wahrheitswert und Buchstabe) zu einem "CoW"-Typ wird und erst on-write kopiert wird.