foreachとarray_walkの処理速度比較
ちょっと気になったので計測してみました。
環境
- 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のほうが速いか...