Connecting Tech Pros Worldwide Forums | Help | Site Map

Copy-on-Write semantic

Xu, Qian
Guest
 
Posts: n/a
#1: Feb 11 '08
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_else; // 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
Guest
 
Posts: n/a
#2: Feb 11 '08

re: Copy-on-Write semantic


On Mon, 11 Feb 2008 16:03:25 +0100, Xu, Qian <no_reply@microsoft.com
wrote:
Quote:
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...
Quote:
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_usage()."\n"; //55736
$a = str_repeat('a',1024*1024);
echo memory_get_usage()."\n"; //1104672
$b = $a;
//memory usage should be altered only slightly:
echo memory_get_usage()."\n";//1104696
$b = str_replace('foo','bar',$b);//
echo memory_get_usage()."\n";//2153344
unset($b);
echo memory_get_usage()."\n";//1104400
?>

Compared to reference (which will alter BOTH $a & $b):
<?php
echo memory_get_usage()."\n"; //55520
$a = str_repeat('a',1024*1024);
echo memory_get_usage()."\n"; //1104288
$b = &$a;
//memory usage should be altered only slightly:
echo memory_get_usage()."\n";//1104336
$b = str_replace('foo','bar',$b);//
echo memory_get_usage()."\n";//1104400
unset($b);
echo memory_get_usage()."\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
Michael Fesser
Guest
 
Posts: n/a
#3: Feb 11 '08

re: Copy-on-Write semantic


..oO(Rik Wasmus)
Quote:
>On Mon, 11 Feb 2008 16:40:42 +0100, Michael Fesser <netizen@gmx.dewrote:
>>
>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:blog.libssh2.org/index.php%3F/archives/51-Youre-being-lied-to..html>

Micha
Rik Wasmus
Guest
 
Posts: n/a
#4: Feb 11 '08

re: Copy-on-Write semantic


On Mon, 11 Feb 2008 17:22:56 +0100, Michael Fesser <netizen@gmx.dewrote:
Quote:
.oO(Rik Wasmus)
>
Quote:
>On Mon, 11 Feb 2008 16:40:42 +0100, Michael Fesser <netizen@gmx.de
>wrote:
>>
Quote:
>>Some more details:
>>>
>>http://blog.libssh2.org/index.php?/a...-lied-to..html
>>
>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:blog.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
Closed Thread