Re: Pointers For Newbies, Reminders For Oldies
| From: | Rene Veerman | Date: | Thu, 28 Jan 2010 13:03:55 +0000 |
| Subject: | Re: Pointers For Newbies, Reminders For Oldies | ||
| References: | 1 2 3 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-301605@lists.php.net to get a copy of this message | ||
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.Ford@leedsmet.ac.uk> wrote:
>> -----Original Message-----
>> From: Rene Veerman [mailto:rene7705@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.ford@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
>
>