LoginSignup
5
3

More than 5 years have passed since last update.

[PHP7]array_mapとforeachの速度検証

Last updated at Posted at 2018-01-31

結果

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

5
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3