【ruby】通常代入と多重代入のベンチマーク
「Rubyソースコード完全解説」の14章に、多重代入について書かれています。
そこには、
Rubyで一番複雑な仕様はどこだ、と問われれば筆者は即座に多重代入と答える。 多重代入の全体像を把握するなんて無理だ。そう思う根拠もある。ようするに、 多重代入の仕様は仕様全体をきれいに設計しようなんてこれっぱかしも思わず に作られているのだ。
と書かれていました。
複雑な処理なら遅いのでは?と思い、前回のキーワード引数同様、処理時間を計測しました。
前回の計測はこちら↓
結果
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重代入ならそこまで遅くないかも
- 数が増えるとそりゃぁ遅いよね
用法用量を守って、いい感じにお使いください。