PHP
PHP7

[PHP7]array_mapとforeachの速度検証

結果

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を使ったほうが早かったです。
ありがとうございますー。