注意: 指標にはなりますが場合によってはパフォーマンスが異なったり挙動が変わったりコードの可読性にも影響するのでちゃんとパフォーマンスを見ながら、テストしながら書きましょう。
参考
https://github.com/JuanitoFatas/fast-ruby
https://speakerdeck.com/sferik/writing-fast-ruby
メモ
- Arrayの数を数えるなら
Array#size
もしくはArray#length
(Enumerable#count
を使うより速い) - Arrayの検索には
Array#find
もしくはArray#detect
(Array#select.first
より速い) - Arrayのランダム取得には
Array#sample
(Array#shuffle.first
より速い) - Arrayの最初の要素の取得は
Array#[0]
(Array#first
より速い) - Arrayの最後の要素の取得は
Array#[-1]
(Array#last
より速い) - Arrayの繰り返しは
Array#each
(for
より速い) - Arrayを処理したものをflatするなら
Array#flat_map
(Array#map.flatten
より速い) - Arrayを逆からeachするなら
Array#reverse_each
(Array#reverse.each
より速い) - Enumerableの並び替えは
Enumerable#sort_by
(単純なEnumerable#sort
より速い) - mapには
Symbol.to_proc
(map(&:to_s)
)(map { |s| s.to_s }
より速い) - Procをcallするなら
yield
(引数に&block
をとってcallするより速い) - Hashのfetchには
Hash#[]
(Hash#fetch
より速い) - Hashの複製には
Hash#[]
(Hash#dup
より速い) - Hashのkeyを繰り返し処理するなら
Hash#each_key
(Hash.keys.each
より速い) - Hashに追加するなら
Hash#[]=
(Hash.merge!
は遅いしHash.merge
はもっと遅い) - 文字列の結合には
'foo' 'bar'
('foo'+'bar'
より速い) - 文字列の開始と終端を調べるには
String#start_with?
やString#end_with?
(正規表現の方が遅い) - 文字列の正規表現には
String#=~
(String#match
より速い) - 文字列の置き換えにはtr(
String#gsub
より速い) - 文字列の置き換えにはさらに
String#[sub_string]=
での置き換えが高速 - attr_accessorがsetter、getterを自分で定義するより速い
- 範囲に入っているかを調べるなら
Range#cover?
(Range.include?
は遅い) - 定義されてないメソッド呼び出し確認には
respond_to?
(begin...rescue
で処理させると遅い) - メソッドは直接
call
する(method_missing
を使うとすごく遅いし、send
も少し遅い)
他にも高速化の手法を発見したら随時追記していきたいと思います。こういう方法もあるよ等大歓迎です。