ど素人から毛を生やす。<延>

ループ中でincludeを行うと、とても重いらしい。

Web > PHP 2023年3月1日(最終更新:1年前)

2023年3月1日に作成されたページです。
情報が古かったり、僕が今以上のど素人だった頃の記事だったりする可能性があります。

どもです。

ループ中でincludeを行うと、べた書きの場合と比較して負荷が凄くかかるらしい。
→結論だけ見る

実験環境:PHP/5.4.15(いい加減に8で仕事したいなぁ)

簡略化した条件での実験

//①

----------
#実行ファイル
$baseMemoryUsage = memory_get_usage();
$baseTime = microtime(true);

for($i=0; $i<X; $i++){
	include("./test.php");
}

$maxMemoryUsage = (memory_get_peak_usage() - $baseMemoryUsage) / (1024 * 1024);
$processTime = microtime(true) - $baseTime;
printf("Max Memory Usage : %.3f [MB]\n", $maxMemoryUsage);
printf("Process Time : %.2f [s]\n", $processTime);

----------

#test.php
echo $i.'<br>';
//②

$baseMemoryUsage = memory_get_usage();
$baseTime = microtime(true);

for($i=0; $i<X; $i++){
	echo $i.'<br>';
}

$maxMemoryUsage = (memory_get_peak_usage() - $baseMemoryUsage) / (1024 * 1024);
$processTime = microtime(true) - $baseTime;
printf("Max Memory Usage : %.3f [MB]\n", $maxMemoryUsage);
printf("Process Time : %.2f [s]\n", $processTime);

結果:

X=10,000
①Max Memory Usage : 0.255 [MB] Process Time : 0.37 [s]
②Max Memory Usage : 0.003 [MB] Process Time : 0.04 [s]

X=100,000
①Max Memory Usage : 0.255 [MB] Process Time : 3.54 [s]
②Max Memory Usage : 0.003 [MB] Process Time : 0.17 [s]

ループ回数をどれだけ増やしても減らしても最大メモリ使用量には違いがありませんでした。
一方、実行時間の方はループ回数とともに増大しています。

②の実行時間は、内容が少なすぎるせいか試行の度にかなりバラついたので、目安にしかなりませんでしたが…

①を見ると実行回数10倍で約10倍の実行時間になっている。
つまりinclude1回につき0.00003秒を使用しているという認識で良いのでしょうか?それなら「負荷が凄くかかる」とは言えませんが…

これが複雑な出力の場合、どのように所要時間が延びるのでしょうか。

X=100
include使用: Max Memory Usage : 1.643 [MB] Process Time : 8.71 [s]
べた書き  : Max Memory Usage : 1.494 [MB] Process Time : 0.25 [s]

X=500
include使用: Max Memory Usage : 6.145 [MB] Process Time : 44.91 [s]
べた書き  : Max Memory Usage : 5.688 [MB] Process Time : 1.30 [s]

実際の仕事の内容でテストしたところ、100ループでも500ループでも、includeはべた書きの約35倍の実行時間になりました。
どうやら実行時間は べた書きの場合の実行時間(1回分)×ループ回数×一定の倍率 となるようです。

先の簡略化テストの場合、1回のincludeに0.00003秒を要した、ではなく、includeの場合の1回の処理に0.00003秒を要した、という解釈が正しいようですね。
includeした内容が軽ければ大した影響はなく、重いほど「負荷が凄くかかる」ようになってしまうことが分かりました。以上、テスト用のデータを用意しては逆に分からないincludeの罠の話でした。

この記事は役に立ちましたか?
  • (・∀・) 参考になった (0)
  • (`・ω・´) 役に立った (0)
  • _(:3」∠)_ 面白かった (1)