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
を用いたパターンは実験しません。時間がかかるのは結局同じで、実用的ではないためです。
$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の情報を参考にするときは、コメント欄まで見たほうがいいです。