PHP、array_map と for文の実行速度は for文の方が速い。しかしもっと速いのは・・・。
みんな知っていることかもしれないけれど・・・。
array_map 関数って便利だなー、是非活用しよう!と思ったんですがもしかしたら速度に問題ないだろうか?と思って調べてみました。
ネットで調べたところでは、
http://www.stackasterisk.jp/tech/php/searchAction.do?cid=27
というのがあって array_map 関数のほうが速いと書いてありました。
でも簡単に作った比較のスクリプトでは array_map の方が遅くて、for文よりも foreach文の方がはやかったのです。
どうやら、
for($i=0; $i<count($array); $i++ ) {
ここの配列の数を毎回取得しているのが原因なのと $i++ より ++$i の方がはやいらしい。なぜかは今は知りませんw
これを直してテストをしました。
また繰り返しも加えたのと foreach を加えたのと、おまけもあります。
簡単に作ったスクリプトは以下の通り。
<?php function a($a) { return $a . "\n"; } $loop = 50; $array = array_pad(array(), 32000, "a"); $array_count = count($array); /* * array_map の計測 */ $s = 0; $s = microtime(true); for ($l = 0; $l < $loop; ++$l) { $array2 = array_map("a", $array); unset($array2); } $u_map = microtime(true) - $s; /* * for文 の計測 */ $s = 0; $s = microtime(true); for ($l = 0; $l < $loop; ++$l) { for($i = 0; $i < $array_count; ++$i) { $array2[] = a($array[$i]); } unset($array2); } $u_for = microtime(true) - $s; /* * foreach文 の計測 */ $s = 0; $s = microtime(true); for ($l = 0; $l < $loop; ++$l) { foreach($array as $k => $d) { $array2[] = a($d); } unset($array2); } $u_foreach = microtime(true) - $s; /* * foreach文 の計測 * 配列の参照を加えた。 */ $s = 0; $s = microtime(true); for ($l = 0; $l < $loop; ++$l) { foreach($array as $k => $d) { $array2[] = a($array[$k]); } unset($array2); } $u_foreach2 = microtime(true) - $s; echo "array_map: $u_map\n"; echo "for: $u_for\n"; echo "foreach: $u_foreach\n"; echo "foreach2: $u_foreach2\n";
結果は、
array_map: 4.18736886978 for: 4.02036190033 foreach: 4.01496505737 foreach2: 4.30645799637
という感じです。