読者です 読者をやめる 読者になる 読者になる

圧倒亭グランパのブログ

圧倒的おじいちゃんを目指して

【ruby】通常代入と多重代入のベンチマーク

ruby

Rubyソースコード完全解説」の14章に、多重代入について書かれています。

第14章 コンテキスト

そこには、

Rubyで一番複雑な仕様はどこだ、と問われれば筆者は即座に多重代入と答える。 多重代入の全体像を把握するなんて無理だ。そう思う根拠もある。ようするに、 多重代入の仕様は仕様全体をきれいに設計しようなんてこれっぱかしも思わず に作られているのだ。

と書かれていました。

複雑な処理なら遅いのでは?と思い、前回のキーワード引数同様、処理時間を計測しました。

前回の計測はこちら↓

at-grandpa.hatenablog.jp

 

結果

Makefile
VERSIONS= \
    2.1.0 \
    2.2.0 \
    2.3.0 \
    2.4.0-dev

run: $(VERSIONS)

$(VERSIONS):
    @rbenv global $@
    @rbenv rehash
    @echo ""
    @echo "==============================================================="
    @ruby -v
    @echo "---------------------------------------------------------------"
    @ruby $(FILE)
    @echo ""
multiple_assignment.rb
require 'benchmark/ips'

Benchmark.ips do |x|
  x.report("x1") do
    a = 11
    b = 22
    c = 33
    d = 44
  end

  x.report("x2") do
    a, b = 11, 22
    c, d = 33, 44
  end

  x.report("x4") do
    a, b, c, d = 11, 22, 33, 44
  end

  x.compare!
end

実行

===============================================================
ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-darwin15.0]
---------------------------------------------------------------
Warming up --------------------------------------
                  x1   256.272k i/100ms
                  x2   196.901k i/100ms
                  x4   151.456k i/100ms
Calculating -------------------------------------
                  x1      8.762M (±12.8%) i/s -     42.797M in   5.001569s
                  x2      6.235M (±15.2%) i/s -     30.126M in   5.013413s
                  x4      2.776M (±17.0%) i/s -     13.480M in   5.080512s

Comparison:
                  x1:  8762249.4 i/s
                  x2:  6234607.7 i/s - 1.41x  slower
                  x4:  2775686.6 i/s - 3.16x  slower



===============================================================
ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-darwin15]
---------------------------------------------------------------
Warming up --------------------------------------
                  x1   256.920k i/100ms
                  x2   196.456k i/100ms
                  x4   140.467k i/100ms
Calculating -------------------------------------
                  x1      8.193M (±19.7%) i/s -     38.024M in   5.017432s
                  x2      5.681M (±22.9%) i/s -     25.932M in   5.032518s
                  x4      2.571M (±20.7%) i/s -     12.361M in   5.071725s

Comparison:
                  x1:  8192719.5 i/s
                  x2:  5681388.9 i/s - same-ish: difference falls within error
                  x4:  2570824.9 i/s - 3.19x  slower



===============================================================
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin15]
---------------------------------------------------------------
Warming up --------------------------------------
                  x1   239.442k i/100ms
                  x2   247.154k i/100ms
                  x4   119.999k i/100ms
Calculating -------------------------------------
                  x1      9.004M (±17.2%) i/s -     43.339M in   5.002784s
                  x2      6.965M (±15.9%) i/s -     33.613M in   5.012408s
                  x4      2.836M (±21.0%) i/s -     13.440M in   5.023156s

Comparison:
                  x1:  9003761.8 i/s
                  x2:  6964843.7 i/s - same-ish: difference falls within error
                  x4:  2836406.5 i/s - 3.17x  slower



===============================================================
ruby 2.4.0dev (2016-08-12 trunk 55879) [x86_64-darwin15]
---------------------------------------------------------------
Warming up --------------------------------------
                  x1   248.252k i/100ms
                  x2   261.370k i/100ms
                  x4   139.406k i/100ms
Calculating -------------------------------------
                  x1      8.687M (±15.4%) i/s -     42.203M in   5.023260s
                  x2      6.502M (±17.1%) i/s -     31.364M in   5.012299s
                  x4      2.959M (±16.4%) i/s -     14.219M in   5.016681s

Comparison:
                  x1:  8687211.1 i/s
                  x2:  6502355.3 i/s - same-ish: difference falls within error
                  x4:  2958782.9 i/s - 2.94x  slower
  • 2重代入ならそこまで遅くないかも
  • 数が増えるとそりゃぁ遅いよね

用法用量を守って、いい感じにお使いください。