ちょっとしたコードの書き方でパフォーマンスが変わることがあります。リーダビリティを重視する向きからすれば小手先のテクニックに映るかも知れないのですが、リーダビリティを維持しながらちゃんとしたパフォーマンスを出すためにも、テクニックを知ることは大事なことだと思うのです。
結構違うもんですなー
というわけで、そんなテクニックをまとめたスライドがWriting Fast Ruby。見ていて参考になったのでメモ。
たとえば引数に&block
をとってcall
するよりも、yield
の方が5倍速い、とか、
def slow(&block) block.call end def fast yield end
map
にブロックを渡すよりも、シンボルを渡す方が20%速い、とか
(1..100).map {|i| i.to_s} (1..100).map(&:to_s)
map
してからflatten
を呼び出すよりも、flat_map
を使ったほうが4.5倍速い、とか
enum.map do # do something end.flatten(1) enum.flat_map do # do something end
Hash#mergeよりも、Hash#merge!の方が3倍速い、とか
enum.inject({}) do |h, e| h.merge(e => e) end enum.inject({}) do |h, e| h.merge!(e => e) end
そういう例がいくつも載っているのです。思うに、Rubyはインスタンスを作るコストが大きいのかな。塵も積もれば山となるって感じですね。ぜひご参考に。