細かすぎて伝わらないRuby最適化Tips

山本悠滋

2015-08-06 表参道.rb

こんにちは!

こんにちは!

こういうの↓とか、

こんにちは!

こういうの↓が大好きなおおきなおともだちです!

きょうのおはなし!

きほん!

その1! なんどもよばれる文字列リテラル

文字列も必ず足されちゃう!

なのでこんな風に長い文字列リテラルを書きたいときは…

"改行\n" +
  "しよう\n" +
  "そうしよう\n"

文字列も必ず足されちゃう!

よりも

"改行\n" \
  "しよう\n" \
  "そうしよう\n"

その2! それ以外のオブジェクトもね!

その2! それ以外のオブジェクトもね!

そして散らばる定数

class Hoge
  AAA = 'aaa'.freeze
  ONE_DAY = 1.day
  NANTOKA_TABLE = { ... }
  ...
end

その3! キーワード引数とHashならどうかな?

その4! defineする?それともe・va・l?

これ↓

def hoge a
  puts a
end

その4! defineする?それともe・va・l?

と、これ↓

define_method :hoge do|a|
  puts a
end

ブロックの外のローカル変数にアクセスできる

a = 1
def foo
  a # エラー!
end

define_method :foo do
  a # エラーにならない!
end

ブロックの外のローカル変数にアクセスできる

待てよ… できることが多いということは、
その分オーバーヘッドがあるんじゃね…?

なので

メソッドを動的に定義したいとき、
外のローカル変数にアクセスしなくてもよい時は

eval "
  def hoge
    #{なんか動的に変わる部分}
  end
"

のように、evalを使った方が速い!

その5! coerceする?それともto_f?

結論!