tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

foreach VS while、list、each

大きな配列を使うときは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倍近くかかっ。。。。

メモリの節約を重視する場面もあるはずなので、
メモリ重視か速度重視かは使いどころ次第ってことですね。