Ruby 2.7.0 にして、キーワード引数関連の大量の警告を出ないように変更していったところ、指定の時間内で処理が終わるというテストが失敗するようになったため、もしかして警告に合わせて変更した部分が影響しているのではないかと考え、速度を調べてみました。
RUBY_VERSION # => "2.7.0"
h = { a: 1, b: 2, c: 3 }
def f1(o = {})
end
def f2(**o)
end
require "active_support/core_ext/benchmark"
def _; "%7.2f ms" % Benchmark.ms { 1000_0000.times { yield } } end
_ { f1(h) } # => " 857.01 ms"
_ { f2(h) } # => "1955.95 ms"
_ { f2(**h) } # => "3679.11 ms"
これでわかったこと
- ハッシュをハッシュとして渡すのはかなり速い
-
f2(**o)
にハッシュを渡すのはハッシュをハッシュとして渡すより2倍ほど重い (そもそも警告がでる) -
f2(**o)
にハッシュを**
をつけて渡すのは単にハッシュをハッシュとして渡すより4倍ほど重い
ということです。
いままで func(options = {})
というのがあると、とりあえず新しい感じの方に合わせとけば利点があるんだろうと考えて func(**options)
の方に寄せていってましたが、速度がもっとも重要なところでは、逆に func(options = {})
の方に寄せていった方がよさそうです。