Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

return large data by reference or as return in function?

On the job today I had an arguement with a collage about passing large data between scopes. The myth was that reference uses less memory/CPU usage when passing between 2 scopes. We build a proof of concept who was right... so:

function by_return($dummy=null) {
    $dummy = str_repeat("1",100 * 1024 * 1024);
    return $dummy;
}

function by_reference(&$dummy) {
    $dummy = null;
    $dummy = str_repeat("1",100 * 1024 * 1024);
}
echo memory_get_usage()."/".memory_get_peak_usage()."\n";
//1 always returns: 105493696/105496656
$nagid = by_return();
echo memory_get_usage()."/".memory_get_peak_usage()."\n";
unset($nagid);
//2 always returns:  105493696/210354184 even if we comment 1st part
by_reference($dummy);
echo memory_get_usage()."/".memory_get_peak_usage()."\n";
unset($dummy);

But it seems that by reference it consumes more memory according to function "memory_get_peak_usage()"

As you see, using large data for returning is much smarter than using as reference but the question is, why? Any enlightening is welcomed :)

like image 467
confiq Avatar asked May 23 '11 20:05

confiq


People also ask

When a function returns a reference to its return value?

When a function returns a reference, it returns an implicit pointer to its return value. This way, a function can be used on the left side of an assignment statement. For example, consider this simple program −.

How many functions return a reference to a range in Excel?

Many of us know the OFFSET function returns a reference to a range of cells, but there are actually 8 Excel functions that return a reference to a range: Each function has their pros and cons.

What happens when you return a reference in C++?

When a function returns a reference, it returns an implicit pointer to its return value. This way, a function can be used on the left side of an assignment statement. When returning a reference, be careful that the object being referred to does not go out of scope.

What is the difference between return by reference and call by reference?

Return by reference is very different from Call by reference. Functions behaves a very important role when variable or pointers are returned as reference. Want to learn from the best curated videos and practice problems, check out the C++ Foundation Course for Basic to Advanced C++ and C++ STL Course for the language and STL.


1 Answers

This is due to the way php handles variables, and is a bit counter-intuitive to anyone who has worked in C or C++.

Passing by reference to be smarter than PHP isn't advised. PHP doesn't actually make copies of data unless it needs to (i.e. you change a variable's value when there's more than 1 reference to it), an optimization strategy very similar to copy-on-write for shared memory pages.

So, let's say you have a variable that you pass by value several times in a given script. If you then take this variable and pass it by reference, you're actually duplicating the variable rather than just getting a pointer to the object.

This is because internally, PHP zvals (the data structure PHP uses to store variables) can only be reference variables or non-reference variables. So it doesn't matter what the zval's ref_count field is, because it's not a reference variable (the is_ref field of the zval structure). So internally, PHP is forced to create a new zval and set its is_ref field to true, thus doubling the memory.

Tell your co-worker to stop trying to outsmart PHP. Passing by reference unless done 100% perfectly throughout the code will cause a lot of overhead and double the memory usage.

For a more detailed discussion, please see this link: http://porteightyeight.com/2008/03/18/the-truth-about-php-variables/

like image 97
gnxtech3 Avatar answered Oct 21 '22 08:10

gnxtech3