うまとま君の技術めも

2015年新卒入社した社畜の勉強内容などなど

Enumerable#map and Array#flatten vs Enumerable#flat_map

目的

  • Enumerable#map, Array#flatten と Enumerable#flat_map でどちらがパフォーマンスに優れているかを調べる。

環境

Enumerable#flat_map

flat_map (Enumerable) - APIdock : http://apidock.com/ruby/Enumerable/flat_map

ベンチマーク

require 'benchmark'

n = 1000
array = Array.new(100) { |i| Array.new(i) { |j| j } }

Benchmark::CAPTION
Benchmark.bm do |x|
  x.report('flat_map') { n.times { array.flat_map { |a| a } } }
  x.report('flat map') { n.times { array.map { |a| a }.flatten(1) } }
end
       user     system      total        real
flat_map  0.030000   0.010000   0.040000 (  0.036725)
flat map  0.260000   0.020000   0.280000 (  0.271837)

まとめ

map , flattenではなくflat_mapを使ったほうが速くなっていますね。

ただ、flat_mapでは1段階までしか平坦化されないで使用する際には注意が必要かもしれないです。

irb(main):055:0> [[1, 2], [[3, 4, 5]]].flat_map { |x| x }
=> [1, 2, [3, 4, 5]]