PHP - Copy On Write und Referenzen



  • Ich setzte mich seit einigen Tagen mit PHP und der Zend Engine auseinander, da ich mir einige Extensions schreiben möchte. Nun versuche ich das Copy On Write zu verstehen. Bisher deute ich das so: Jede Variable, Array, Objekt, welches ich als Parameter einer Funktion übergebe, ist zunächst eine Referenz. Greife ich schreibend auf die Variable zu($parameter++), dann wird ein Kopie angelegt und auf diese die Operation durchgeführt.

    Dadurch dürfte sich also kein Geschwindigkeitsgewinn ergeben, wenn ich Daten per Referenz an eine Funktion übergebe.

    Habe ich das soweit richtig verstanden? 😕



  • Hallo,

    Dadurch dürfte sich also kein Geschwindigkeitsgewinn ergeben, wenn ich Daten per Referenz an eine Funktion übergebe.

    Wenn du es direkt per Referenz übergibst, dann ist die Bedeutung ja auch eine andere. Dann sagst ja du, dass du eben genau das Objekt selber verändern willst, also praktisch gar keine Kopie haben willst. Oder versteh ich dich jetzt falsch? Ansonsten hast du das richtig verstanden, es wird erst eine Kopie erzeugt, wenn eine erzeugt werden muss, nämlich beim Verändern des Objekts. Das ist natürlich schon ein Geschwindigkeitgewinn.



  • Danke, mir ging es dabei nur um die Geschwindigkeit. By reference ist halt schneller als by value. Demnach werden ja Werte erstmal immer by ref übergeben. 🙂



  • Marc. M. schrieb:

    [...] By reference ist halt schneller als by value.[...]

    Das stimmt in PHP nicht. In PHP ist es extrem aufwändig, Referenzen zu erstellen, deshalb wird ja auch im Normalfall immer copy-by-value gemacht. Referenzen sind in PHP extrem langsam und sollten nur dann verwendet werden, wenn man sie auch wirklich benötigt.

    Marc M. schrieb:

    Bisher deute ich das so: Jede Variable, Array, Objekt, welches ich als Parameter einer Funktion übergebe, ist zunächst eine Referenz.

    Da liegst Du falsch. PHP kopiert immer.

    Gruß Jens



  • Hallo,

    ich kenne Copy on Write nur durch C++ und bei PHP habe ich vor diesem Thread noch nix davon gehört. Welchen Sinn soll das denn dann bitte haben?


Anmelden zum Antworten