Thanks for your research Mike, i'm a bit puzzled.

I have a custom random-array generator that i use to fill the
available memory to it's max, about 1.5G on a 2G system, then passing
it to a recursive json string generator.
Not passing by reference did double my memory requirements, but i've
changed about 7-10 functions so i dont know which one was the pig..

On Thu, Jan 28, 2010 at 12:41 PM, Ford, Mike <m.f...@leedsmet.ac.uk> wrote:
>> -----Original Message-----
>> From: Rene Veerman [mailto:rene7...@gmail.com]
>> Sent: 27 January 2010 22:46
>>
>> And if your script needs to pass large (> 5Mb) arrays around to
>> functions, be sure to use passing-by-reference; failing to do so can
>> double your memory requirements,
>> possibly hitting the ini_set('memory_lmit', ??)
>
> Have you benchmarked this? PHP's copy-on-change philosophy means there 
> shouldn't be much difference in memory terms -- so unless you actually expect 
> to change the array's contents, you should pass by value.
>
> As proof, I constructed this little test:
>
>        function test($arg, $base_mem)
>        {
>                echo "Additional inside func = ", 
> memory_get_usage()-$base_mem, "<br />\n";
>        }
>
>        $mem_start = memory_get_usage();
>
>        $array = array_fill(1,1000,"The quick brown fox jumps over the lazy 
> dog");
>        $mem_array = memory_get_usage();
>
>        echo "After array creation = ", $mem_array-$mem_start, "<br />\n";
>
>        test($array, $mem_array);
>
>        echo "Final = ", memory_get_usage()-$mem_start, "<br />\n";
>
> Which produced:
>
>        After array creation = 546104
>        Additional inside func = 208
>        Final = 546312
>
> Changing the function definition to have &$arg instead of just $arg changed 
> this to:
>
>        After array creation = 545984
>        Additional inside func = 208
>        Final = 546192
>
> In other words, there was no difference in the memory used to call a function 
> with a by-reference argument vs a by-value argument, but the by-value version 
> occupied an additional 120 bytes overall (which is hardly going to break the 
> bank!). (By varying the numbers in the array_fill(), I found some minor 
> variations, but nothing significant.)
>
> Much more interesting is adding the following line to the beginning of the 
> function:
>
>        $x = count($arg);
>
> In this case, the by-value figures were:
>
>        After array creation = 546104
>        Additional inside func = 280
>        Final = 546384
>
> ... but by-reference gave:
>
>        After array creation = 545984
>        Additional inside func = 64600
>        Final = 610456
>
> In other words, just using count() on the array increased memory usage for 
> the by-*reference* version by over 60 kbytes, whereas the by-value version 
> only went up by 72 bytes.
>
> Finally, I ran a quick benchmark of runtimes for a version of the function 
> that just returns a single element of the array, which doesn't incur the 
> ballooning memory demonstrated above. For 10,000 calls to the function (in a 
> for loop, and averaged over several runs), the respective times were:
>
>        By value:        5.54sec
>        By reference:    5.64sec
>
> Or, the by-value version was very, very slightly quicker.
>
> All in all, there is no evidence that passing arrays to functions by value is 
> inherently more expensive than by reference, and in fact in some cases it can 
> be significantly cheaper. Which in turn says that you should only pass 
> arguments by reference when you actually expect to change them, which is 
> after all what the by-reference operator is there for in the first place! QED.
>
> Cheers!
>
> Mike
>
>  --
> Mike Ford,
> Electronic Information Developer, Libraries and Learning Innovation,
> Leeds Metropolitan University, C507, Civic Quarter Campus,
> Woodhouse Lane, LEEDS,  LS1 3HE,  United Kingdom
> Email: m.f...@leedsmet.ac.uk
> Tel: +44 113 812 4730
>
>
>
>
> To view the terms under which this email is distributed, please go to 
> http://disclaimer.leedsmet.ac.uk/email.htm
>
> --
> PHP General Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
>
>

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to