Copy-on-Write semantic

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Xu, Qian

    Copy-on-Write semantic

    Hi All,

    is there a Copy-on-Write semantic behind PHP compiler?

    $a = long_string_1mb ;
    $b = $a; // Compiler will allocates another 1MB for this variable.

    I have to use "$b =& $a;" to avoid memory waste.
    I think this should be done by compiler itself. For instance:

    $a = lang_string_1mb ; // Compiler will allocate a memory block and alter
    variable $a point to this address. And set reference count of this
    memory block to 1.
    $b = $a; // Compiler will alter variable $b to the same memory block and
    increment reference count to 2.
    $b = some_string_els e; // Compiler will allocate another memory block
    for $b and decrement the previous reference count to 1.

    This will be more efficient than managing referencing by ourselves.

    --
    Xu, Qian (stanleyxu)
  • Rik Wasmus

    #2
    Re: Copy-on-Write semantic

    On Mon, 11 Feb 2008 16:03:25 +0100, Xu, Qian <no_reply@micro soft.com
    wrote:
    Hi All,
    >
    is there a Copy-on-Write semantic behind PHP compiler?
    >
    $a = long_string_1mb ;
    $b = $a; // Compiler will allocates another 1MB for this variable.
    Not yet...
    I have to use "$b =& $a;" to avoid memory waste.
    I think this should be done by compiler itself. For instance:
    It is done. Only if you change either $a or $b will they be copied/doubled
    (see memory usage on a test run here as a comment after the line):

    <?php
    echo memory_get_usag e()."\n"; //55736
    $a = str_repeat('a', 1024*1024);
    echo memory_get_usag e()."\n"; //1104672
    $b = $a;
    //memory usage should be altered only slightly:
    echo memory_get_usag e()."\n";//1104696
    $b = str_replace('fo o','bar',$b);//
    echo memory_get_usag e()."\n";//2153344
    unset($b);
    echo memory_get_usag e()."\n";//1104400
    ?>

    Compared to reference (which will alter BOTH $a & $b):
    <?php
    echo memory_get_usag e()."\n"; //55520
    $a = str_repeat('a', 1024*1024);
    echo memory_get_usag e()."\n"; //1104288
    $b = &$a;
    //memory usage should be altered only slightly:
    echo memory_get_usag e()."\n";//1104336
    $b = str_replace('fo o','bar',$b);//
    echo memory_get_usag e()."\n";//1104400
    unset($b);
    echo memory_get_usag e()."\n";//1104400
    ?>

    In short, as the manual allready states, don't use references as a
    premature optimizer. The interpreter is smart enough to do it. Only use
    references if you need the reference in your code.
    --
    Rik Wasmus

    Comment

    • Michael Fesser

      #3
      Re: Copy-on-Write semantic

      ..oO(Rik Wasmus)
      >On Mon, 11 Feb 2008 16:40:42 +0100, Michael Fesser <netizen@gmx.de wrote:
      >>
      >Hmm, interested in the link, seems dead here though (times out even after
      >5 minutes of waiting...)
      Works here.

      Try the Google cache:

      <http://www.google.com/search?q=cache: OYf5tIVEHfEJ:bl og.libssh2.org/index.php%3F/archives/51-Youre-being-lied-to..html>

      Micha

      Comment

      • Rik Wasmus

        #4
        Re: Copy-on-Write semantic

        On Mon, 11 Feb 2008 17:22:56 +0100, Michael Fesser <netizen@gmx.de wrote:
        .oO(Rik Wasmus)
        >
        >On Mon, 11 Feb 2008 16:40:42 +0100, Michael Fesser <netizen@gmx. de
        >wrote:
        >>>>
        >Hmm, interested in the link, seems dead here though (times out even
        >after
        >5 minutes of waiting...)
        >
        Works here.
        >
        Try the Google cache:
        >
        <http://www.google.com/search?q=cache: OYf5tIVEHfEJ:bl og.libssh2.org/index.php%3F/archives/51-Youre-being-lied-to..html>
        Ah, that works. Nothing new for me, but clearly explained stuff. I'll keep
        it bookmarked for future reference.
        --
        Rik Wasmus

        Comment

        Working...