foreachとarray_walkの処理速度比較

ちょっと気になったので計測してみました。

  • 連想配列をforeachとarray_walkで処理したそれぞれの処理時間を計測
  • 連想配列の要素変更と標準出力への表示をそれぞれ実施
  • 計測: Benchmerk1.2.7
  • 素数: 50000

環境

  • VirtualBox 3.1.6
  • Memory 386MB
  • Ubuntu10.04 LTS
  • PHP 5.3.2-1ubuntu4

Benchmarkのインストール

$ pear install benchmark

テストコード

  • test_foreach.php
<?php
require_once('Benchmark/Timer.php');

$timer = new Benchmark_Timer();

$timer->start();

// 配列生成
$timer->setMarker('createAssc_start');
foreach (range(1,50000) as $number) {
  $arr["key_$number"] = "testValue_$number";
}
$timer->setMarker('createAssc_end');

// foreachによる配列処理
echo("foreach...\n");
$flag = 'modified';
$timer->setMarker('foreach_modstart');
foreach ($arr as $key => &$value) {
//  $arr[$key] = $value . $flag;
  $value = $value . $flag;
}
echo("\n\n");
$timer->setMarker('foreach_modcend');

$timer->setMarker('foreach_printstart');
foreach ($arr as $key => $value) {
  echo("$key: $value\n");
}
echo("\n\n");
$timer->setMarker('foreach_printend');

$timer->stop();

$timer->display();
?>

test_array_walk.php

<?php
require_once('Benchmark/Timer.php');

$timer = new Benchmark_Timer();

$timer->start();

// 配列生成
$timer->setMarker('createAssc_start');
foreach (range(1,50000) as $number) {
  $arr["key_$number"] = "testValue_$number";
}
$timer->setMarker('createAssc_end');

// ユーザ定義関数
function mod_arr(&$value, $key, $flag=null) {
  $value = $value . $flag;
}

function output_arr($value, $key) {
  echo("$key: $value\n");
}

// ユーザ定義関数による配列処理
echo("array_walk\n");
$timer->setMarker('array_walk_modstart');
array_walk($arr, 'mod_arr', 'modified');
echo("\n\n");
$timer->setMarker('array_walk_modend');

$timer->setMarker('array_walk_printstart');
array_walk($arr, 'output_arr');
echo("\n\n");
$timer->setMarker('array_walk_printend');
$timer->stop();

$timer->display();
?>

計測結果

foreach
  • 値変更: 0.055759
  • echoによる表示: 39.295299
No marker time index ex time perct
1 Start 1273027820.39188700 - 0.00%
2 createAssc_start 1273027820.39223700 0.000350 0.00%
3 createAssc_end 1273027820.76894100 0.376704 0.95%
4 foreach_modstart 1273027820.76915400 0.000213 0.00%
5 foreach_modcend 1273027820.82491300 0.055759 0.14%
6 foreach_printstart 1273027820.82499000 0.000077 0.00%
7 foreach_printend 1273027860.12028900 39.295299 98.91%
8 Stop 1273027860.12059200 0.000303 0.00%
9 total - 39.728705 100.00%
array_walk
  • 値変更: 0.383249
  • echoによる表示: 42.351907
No marker time index ex time perct
1 Start 1273027899.40861800 - 0.00%
2 createAssc_start 1273027899.40899100 0.000373 0.00%
3 createAssc_end 1273027899.80117800 0.392187 0.91%
4 array_walk_modstart 1273027899.80152700 0.000349 0.00%
5 array_walk_modend 1273027900.18477600 0.383249 0.89%
6 array_walk_printstart 1273027900.18484500 0.000069 0.00%
7 array_walk_printend 1273027942.53675200 42.351907 98.20%
8 Stop 1273027942.53721700 0.000465 0.00%
9 total - 43.128599 100.00%


foreachのほうが速いか...