3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PHP7系におけるループのメモリ使用量と処理速度を比較

Posted at

https://qiita.com/h13/items/a75fba76f435212a2eb3
こちらの記事でなされている実験が、PHP7系ではどのような結果になるかを実験してみました。
PHP5とPHP7ではメモリ管理において大きな違いがあるようなので、実際に検証してみようと思います。
実際、かなり違いました。

この記事の目的

2018/12/27現在、php メモリ節約 でググると元記事が一番上にヒットします。
ですがPHP7系では違う結論に至るため、**「あれ? 書いてあることと違うぞ?」**ってなったのでこの記事を書いた次第です。
古い情報をgoogle先生に除外してもらいたい。

実行環境

MacBook Pro
OS Mojave v10.14.2
プロセッサ 3.1Ghz Intel Core i5
メモリ 16GB 2133 Mhz LPDDR3

PHP 7.1.19 (cli) (built: Aug 17 2018 20:10:18) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies

マシンが違うので少なくとも実行時間は元記事と違うのは注意してください。

実験方法

元記事と全く同じ方法で実験します。
ただし、今回はarray_shift を用いたパターンは実験しません。時間がかかるのは結局同じで、実用的ではないためです。

sample.php
$baseMemoryUsage = memory_get_usage();
$baseTime = microtime(true);

for ($i = 0; $i < 100; $i++) {
    $data = range(1, 100000);
    // ここでループ処理を行います。
    $data = null;
}

$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);

結果

ループのパターンと番号は元記事に合わせていますので、各パターンは元記事を参照してください。

No. ループ文 パターン メモリ[MB] 処理時間[s]
0.0. - NOP 4 0.193
1.1. foreach 通常 8 0.619
1.2. foreach 節約 8 0.995
1.3. foreach 通常-参照渡し 12 0.737
1.4. foreach 節約-参照渡し 10 0.775
2.1. while 通常 8 1.679
2.2. while 節約 8 1.974
3.1. for 通常 8 0.652
3.2. for 節約 8 0.766

処理時間は他のプロセスやマシンスペックに影響されているため、あまり価値のあるデータではないでしょう。
相対的な値として捉えてください。

結論

PHP7になってメモリ管理に関するアップデートが行われた結果、何もひねらずforeachを使えば良いということがわかりました。Copy-On-Writeですね。
道具の進化により人の労力が削減される好例かと思います。

結論:普通にforeach使おう

余談

Qiitaの情報を参考にするときは、コメント欄まで見たほうがいいです。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?