結果
PHP7でもforeachが早い!
検証
<?php
// 100万件の検証用配列
$l = [];
for($i = 0; $i < 1000000; ++$i){
$l[] = $i;
}
// 性能計測処理
function profile($text, $f){
$start = microtime(true);
$f();
$end = microtime(true);
echo "[$text]\n" . ($end - $start) . "\n";
}
// 1 : 普通に書きたくなるクロージャを使ったarray_map
profile("array_map + closure", function() use($l){
$ll = array_map(function($t){
return $t + 1;
}, $l);
return $ll;
});
// 2 : 性能が良くなればいいなと思って関数をローカルに定義したバージョン
profile("array_map + function inner", function() use($l){
function plus_inner($num){
return $num + 1;
}
$ll = array_map('plus_inner', $l);
return $ll;
});
// 3 : 性能が良くなればいいなと思って関数を外部に定義したバージョン
function plus_outer($num){
return $num + 1;
}
profile("array_map + function outer", function() use($l){
$ll = array_map('plus_outer', $l);
return $ll;
});
// 4 : 従来通りのforeach
profile("foreach", function() use($l){
$ll = [];
foreach($l as $t){
$ll[] = $t + 1;
}
return $ll;
});
処理 | 時間(秒) | |
---|---|---|
1 | [array_map + closure] | 0.542418003082280 |
2 | [array_map + function inner] | 0.384681224823000 |
3 | [array_map + function outer] | 0.368507146835330 |
4 | [foreach] | 0.067167043685913 |
それでも
でも関数型的書き方のほうが、変数宣言と初期化が一緒にできるから好き。
100万件でこれぐらいの誤差なんだから普通に使おう。
追記
アホな検証をしてました。
@ArimaRyunosukeさんのコメントにあるバージョンで検証方法・結果を書き換えました。
クロージャーより宣言したfunctionを使ったほうが早かったです。
ありがとうございますー。