Copy on write

php.internals

dletz@blog.de

19 years ago
Hello everyone in version the 5.2.1 i get strange results when using the reference operator on arrays. When writing a function "a" with call by reference: function &a(&$anArray) { return $anArray; } and another function "b": function b($anArray) { return $anArray; } Then on my machine it takes much longer to call function "a" than to call function "b". Actually it seems that function "a" always copies the hole array wheter or not i write to it - while function "b" does not copy that array as long as i only read from it. But why does function "a" copy at all? Has anyone a explanation? Here is the benchmark code which shows the speed difference: <?php echo phpversion()."\n"; echo "test1\ttest2\n"; function a($p){return $p;} function &b(&$p){return $p;} $test1 = $test2 = array(); for ($i = 0;$i < 10000;$i++) {$test_array[] = $i;} $repeat = 10; for($j=0;$j<$repeat;$j++) { $start_time = microtime(true); for ($i=0;$i<500;$i++) { $x = a($test_array); $x[0]; } $execution_time = microtime(true) - $start_time; echo number_format($execution_time,4)."\t"; $test1[] = $execution_time; $start_time = microtime(true); $count = count($test_array); for ($i=0;$i<500;$i++) { $x = b($test_array); $x[0]; } $execution_time = microtime(true) - $start_time; echo number_format($execution_time,4)."\n"; $test2[] = $execution_time; } echo "==============\n"; echo number_format(array_sum($test1)/$repeat,4)."\t"; echo number_format(array_sum($test2)/$repeat,4)."\n"; ?> Output on my machine: 5.2.1 test1 test2 0.0004 0.8020 0.0004 0.7862 0.0004 0.7970 0.0004 0.7752 0.0004 0.7783 0.0004 0.7797 0.0004 0.7834 0.0004 0.7806 0.0004 0.7747 0.0004 0.7777 ============== 0.0004 0.7835