私はキーがDate
で、値がInteger
であるハッシュの配列を持っています。 これをエミュレートするテストコードです。なぜRange#が含まれていますか?演算子の大小よりもはるかに遅い
hashes = 2000.times.map do |i|
[Date.new(2017) - i.days, rand(100)]
end.to_h
特定の期間の値を取得したいと考えています。 最初はRange#include?
と書いたが、それはかなり遅かった。
Benchmark.measure do
hashes.select{|k,v| (Date.new(2012,3,3)..Date.new(2012,6,10)).include?(k)}
end
#<Benchmark::Tms:0x007fd16479bed0 @label="", @real=2.9242447479628026, @cstime=0.0, @cutime=0.0, @stime=0.0, @utime=2.920000000000016, @total=2.920000000000016>
オペレータが単純か大きいか小さいかによって、60倍も速くなりました。
Benchmark.measure do
hashes.select{|k,v| k >= Date.new(2012,3,3) && k <= Date.new(2012,6,10)}
end
#<Benchmark::Tms:0x007fd162b61670 @label="", @real=0.05436371313408017, @cstime=0.0, @cutime=0.0, @stime=0.0, @utime=0.05000000000001137, @total=0.05000000000001137>
私はこれらの2つの表現が基本的に同じだと思いました。
なぜ大きな違いがありますか?