【发布时间】:2016-10-11 00:49:29
【问题描述】:
我有一个哈希数组,其中键是Date,值是Integer。
这是一个模拟它的测试代码。
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>
我认为这两个表达基本相同。
为什么差别这么大?
【问题讨论】:
标签: ruby activesupport