PHPで関数に巨大な引数を渡してもいいの?

phpで引数が巨大(メモリ的な意味で)なときってオーバーヘッドがすごかったりしないのか気になりました。
過去にCでクイックソートをしたとき、再帰で書くと最悪なケース(昇順で並べたいのにすでに降順で並んでるとか)の時に関数呼び出しのオーバーヘッド、関数を一つ呼ぶ度にスタックカウンタがふえて、関数をスタックして、OSで決められているスタックを超えちゃって落ちちゃう、という問題、があったので気になりました。
今回は回数じゃなくてでっかい引数をわたしたらどうなるか、を検証。

<?php
echo “just started.”.memory_get_usage()/(1024*1024).”MB\n”;$arr = array();
for($i=0; $i<1000000; $i++){
$arr[] = (string)$i;
}
echo “after making 1 million array.”.memory_get_usage()/(1024*1024).”MB\n”;
func_rec($arr, $count);

function func_rec($arg, $count){
echo $count. ” calling.”.memory_get_usage()/(1024*1024).”MB\n”;
sleep(1);
if($count > 30){
return $arg;
}else{
func_rec($arg, $count+1);
}
}

%php large_arg.php
just started.0.0978546142578MB
after making 1 million array.313.283927917MB
calling.313.28452301MB
1 calling.313.285057068MB
2 calling.313.285591125MB
3 calling.313.286125183MB
4 calling.313.286659241MB
5 calling.313.287193298MB
6 calling.313.287727356MB
7 calling.313.288261414MB
8 calling.313.288795471MB
9 calling.313.289329529MB
10 calling.313.289863586MB
11 calling.313.290397644MB
12 calling.313.290931702MB
13 calling.313.291465759MB
14 calling.313.291999817MB
15 calling.313.293037415MB
16 calling.313.293571472MB
17 calling.313.29410553MB
18 calling.313.294639587MB
19 calling.313.295173645MB
20 calling.313.296218872MB
21 calling.313.29675293MB
22 calling.313.297286987MB
23 calling.313.297821045MB
24 calling.313.298355103MB
25 calling.313.29888916MB
26 calling.313.299423218MB
27 calling.313.299957275MB
28 calling.313.300491333MB
29 calling.313.301025391MB
30 calling.313.301559448MB
31 calling.313.303100586MB

結果は特に問題がなさそうです。ちょっと気になったので。

コメントを残す