概要
Laravelで特定のコレクション型の変数から「idがkeyで名前がvalueの値を抽出したい」というケースがありました。
その時にmap
とpluck
で両方の書き方がある(厳密にいうと全く同じ形式の値にはならないが、その後の使い方は似ることが多い)が、どちらの方がパフォーマンス的には良いのか疑問に思ったので検証してみました。
検証方法
・測定する項目は「メモリ使用量」と「処理時間」とする。
・対象のコレクション型の変数は100個のオブジェクトが入っているものを使用する。
・10回の測定を終えて、それぞれの平均値を比較する。
対象データの例
今回使用するのは下記のようなオブジェクトが100個ほどあるコレクション型の値である。
そこから「idがkeyで名前がvalueの値を抽出したい」というケースを実践する。
{
"id":1,
"name":"hogehoge",
"birthday":"2022-11-05",
"department":"Sales"
}
関数それぞれの使い方
map
$fuga = $hoge->map(function ($value) {
return [$value['id'] => $value['name']];
});
pluck
$fuga = $hoge->pluck('name', 'id');
結果
関数名 | メモリ使用量(MB) | [平均値] 処理速度(秒) |
---|---|---|
map | 0.108... | 0.001070356369 |
pluck | 0.073... | 0.001692199707 |
計測データ
[n回目] | 関数名 | 処理時間(秒) |
---|---|---|
1 | map | 0.0026521682739258 |
1 | pluck | 0.0014410018920898 |
2 | map | 0.00081801414489746 |
2 | pluck | 0.0017158985137939 |
3 | map | 0.00068807601928711 |
3 | pluck | 0.0018410682678223 |
4 | map | 0.0010271072387695 |
4 | pluck | 0.002047061920166 |
5 | map | 0.00060510635375977 |
5 | pluck | 0.0014269351959229 |
6 | map | 0.00087904930114746 |
6 | pluck | 0.0018661022186279 |
7 | map | 0.00098681449890137 |
7 | pluck | 0.0016438961029053 |
8 | map | 0.0010371208190918 |
8 | pluck | 0.0013530254364014 |
9 | map | 0.00086712837219238 |
9 | pluck | 0.0017991065979004 |
10 | map | 0.0011429786682129 |
10 | pluck | 0.0017879009246826 |
まとめ
Laravelで特定の値から「idだけ抽出したコレクション型の値を作りたい」「idがkeyで名前がvalueの値を抽出したい」などのケースにおいて、
処理速度ではmapの方が速そうだが、メモリ使用量ではpluckの方が優った。
結局、どっちを使ったら良いかはケースバイケースですね。