map(&:id)とpluck(:id)はどちらが速いのか

こんにちは!kossyです!



さて今回は、rubyのメソッドであるmapと、Railsのメソッドであるpluckメソッドの速さの違いを
ブログに残してみたいと思います。




実行結果



結論はpluckの方が速いです。

```

[12] pry(main)> Member.all.map(&:id)
Member Load (1.4ms) SELECT `members`.* FROM `members`
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40]
[13] pry(main)> Member.all.pluck(:id)
(0.5ms) SELECT `members`.`id` FROM `members`
=> [8, 7, 3, 2, 4, 11, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 12, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 13, 40, 14, 15, 16, 17, 18, 19, 9, 5, 6, 1, 10]

```

pluckで取得した値はソートされていませんが、sortメソッドを使用しても、pluckの方が速いです。


なぜか。


これは、mapの方はレシーバの数だけブロック内の処理を実行しているからだと思います。
つまり、pluckよりも計算する回数が多い。
対してpluckは、rubyのメソッドではなくActiveRecordのメソッドで、引数に指定したカラムのみのSELECT文に絞られているため処理が速いです。

ただ、場合によっては(pluckで取得する数が膨大な場合等)mapの方が処理速度が速いこともあるそうです。




参考
pluckよりもmapのほうが高速なケース - Qiita
mapとpluck | Railsの小技 | DoRuby
pluckとmap の違いを調査する - Qiita