大きな配列を使うときはforeachではなくlistとeachで回すとメモリを節約できる
という記事を目にしたので使えるなら即使おうと思ってまずは検証
http://www.gesource.jp/weblog/?p=4397
適当に1000000個ほどkey=>valueを持つ配列を作成後、
その配列をループして速度を検証
looptest.php
<?php require_once("lib/Benchmark/Timer.php"); $timer = new Benchmark_Timer; $timer->start(); // 適当に配列を作る $loop_num = pow(10,6); $sample_array = array(); foreach ( range(1,$loop_num) as $num ){ $sample_array["key$num"] = "val$num"; } // foreach計測 $timer->setMarker('foreach_start'); foreach( $sample_array as $k1=>$v1) { $any1 = $k1 . $v1; // 意味ない処理 } $timer->setMarker('foreach_end'); reset($sample_array); // while list each計測 $timer->setMarker('while_start'); while(list($k2, $v2) = each($sample_array)) { $any2 = $k2 . $v2; } $timer->setMarker('while_end'); $timer->stop(); $timer->display(); ?>
結果
# php looptest.php ------------------------------------------------------------ marker time index ex time perct ------------------------------------------------------------ Start 1366096014.84607300 - 0.00% ------------------------------------------------------------ foreach_start 1366096016.28825400 1.4421811103821 18.06% ←無駄に配列作ってる ------------------------------------------------------------ foreach_end 1366096016.63340400 0.34514999389648 4.32% ←foreachの処理時間% ------------------------------------------------------------ while_start 1366096016.63347700 7.2956085205078E-5 0.00% ------------------------------------------------------------ while_end 1366096022.83165400 6.1981770992279 77.62% ←while,list,eachの処理時間% ------------------------------------------------------------ Stop 1366096022.83171500 6.103515625E-5 0.00% ------------------------------------------------------------ total - 7.9856421947479100.00%
メモリ節約できるか、は検証しなかったけどwhileのほうが時間が20倍近くかかっ。。。。
メモリの節約を重視する場面もあるはずなので、
メモリ重視か速度重視かは使いどころ次第ってことですね。