プロを目指す人のためのRuby入門 を今読んでいる。
で。
ちょっと気になった事があった。
120ページ、4.7.8。
配列を連結する際に
a=[10,20,30]
b=[1,2,*a,3,4]
と書くことを薦めていた。
えーこれって遅かったりするんじゃないの? と思って測ってみた。
ソースコードは
ruby
require "benchmark"
a=Array.new(ARGV[0].to_i){ |x| x }
N=1000000
puts "%.3f" % ( Benchmark.realtime do
N.times do
b=[1,2,*a,3,4]
end
end )
puts "%.3f" % ( Benchmark.realtime do
N.times do
b=[1,2]+a+[3,4]
end
end )
こんな感じ。実行結果は
■ a.size==100
[1,2,*a,3,4] |
[1,2]+a+[3,4] |
|
---|---|---|
ruby 2.4.2 | 0.949 | 0.630 |
ruby 2.3.5 | 0.946 | 0.639 |
ruby 2.2.7 | 1.225 | 0.748 |
■ a.size==3
[1,2,*a,3,4] |
[1,2]+a+[3,4] |
|
---|---|---|
ruby 2.4.2 | 0.779 | 0.556 |
ruby 2.3.5 | 0.789 | 0.563 |
ruby 2.2.7 | 0.836 | 0.591 |
というわけで、やっぱり若干 splat 展開が遅い。
でももっと差が出ると思っていたので、大差ないことに驚いた。
2.2 と 2.3 の間で何かあったらしいことが伺える。ありがたや。