注意: 指標にはなりますが場合によってはパフォーマンスが異なったり挙動が変わったりコードの可読性にも影響するのでちゃんとパフォーマンスを見ながら、テストしながら書きましょう。
参考
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も少し遅い)
他にも高速化の手法を発見したら随時追記していきたいと思います。こういう方法もあるよ等大歓迎です。