423,350 Members | 2,519 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 423,350 IT Pros & Developers. It's quick & easy.

Copy-on-Write semantic

P: n/a
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)
Feb 11 '08 #1
Share this Question
Share on Google+
3 Replies


P: n/a
On Mon, 11 Feb 2008 16:03:25 +0100, Xu, Qian <no******@microsoft.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_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
Feb 11 '08 #2

P: n/a
..oO(Rik Wasmus)
>On Mon, 11 Feb 2008 16:40:42 +0100, Michael Fesser <ne*****@gmx.dewrote:
>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>

Micha
Feb 11 '08 #3

P: n/a
On Mon, 11 Feb 2008 17:22:56 +0100, Michael Fesser <ne*****@gmx.dewrote:
.oO(Rik Wasmus)
>On Mon, 11 Feb 2008 16:40:42 +0100, Michael Fesser <ne*****@gmx.de
wrote:
>>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
Feb 11 '08 #4

This discussion thread is closed

Replies have been disabled for this discussion.