Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

Organization

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

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の情報を参考にするときは、コメント欄まで見たほうがいいです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What are the problem?