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