2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Ruby 2.7.0 で速度が重要なときは double splat 引数に double splat 演算子をつけてハッシュを渡すより単にハッシュをハッシュとして渡すほうが良い

Last updated at Posted at 2020-03-05

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"

これでわかったこと

  1. ハッシュをハッシュとして渡すのはかなり速い
  2. f2(**o) にハッシュを渡すのはハッシュをハッシュとして渡すより2倍ほど重い (そもそも警告がでる)
  3. f2(**o) にハッシュを ** をつけて渡すのは単にハッシュをハッシュとして渡すより4倍ほど重い

ということです。

いままで func(options = {}) というのがあると、とりあえず新しい感じの方に合わせとけば利点があるんだろうと考えて func(**options) の方に寄せていってましたが、速度がもっとも重要なところでは、逆に func(options = {}) の方に寄せていった方がよさそうです。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?