どもです。
つい昨日、こんなことを呟きました。
膨大な行のMySQLをPHPでSELECTしたとき、resource型で保持して使用するときにwhileするのと一度配列にぶち込んでforeachするのとで、どれくらい負荷と速度に差があるのか知りたい。
いや前者の方が良いのはわかるんだけど!可能なら後者でいきたいんだ!
いや前者の方が良いのはわかるんだけど!可能なら後者でいきたいんだ!
ということで、調べます。
PHPバージョンは5.4.15、Linuxサーバーです。
材料:
1万行×11カラムのテスト用テーブル
$baseMemoryUsage = memory_get_usage();
$baseTime = microtime(true);
$q = "SELECT * FROM `test_dummy`";
/* 共通なので略:MySQLにアクセスして$result(リソース)を取得 */
//1.resource型で保持して使用するときにwhileする
while($rows = mysql_fetch_assoc($result)){
$rows["column1"] = "123";
}
//2.一度配列にぶち込んでforeachする
$re = array();
while($rows = mysql_fetch_assoc($result)){
$re[] = $rows;
}
foreach($re as $k => $v){
$re["column1"] = "123";
}
$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);
結果
1. Max Memory Usage : 5.978 [MB] Process Time : 0.06 [s]
2. Max Memory Usage : 21.941 [MB] Process Time : 0.08 [s]
何度か試行しましたが、誤差は殆どなし。だいたいこの数値で良いでしょう。
1万行程度じゃあ速度にはほぼ影響なしかぁ。
ただしメモリは約4倍。
たぶん1万行×11カラムをそのまま配列にして16MBなのでしょう。resource型って容量食わないんですね…
1万行を一気に捌くような事態は想定にありませんが、起こり得る事態の対策をしないのは宜しくない。
やはり件数が多いときはresourceで持つのが吉か。mysql系の関数は集約したかったのだけど、残念(;´・ω・)
☆計測方法はこちらのQiitaから拝借しました。
[PHP]ループのメモリ使用量と処理速度を比較しました