:
require 'benchmark'
class RangeRandom
def initialize(ranges=[])
@prepped_ranges = ranges.map{ |r| [ r.begin, r.end - r.begin, r.end ] }
end
def rand
range = @prepped_ranges[ Kernel::rand( @prepped_ranges.size ) ]
range[0] + Kernel::rand( range[1] )
end
end
:
range_random = RangeRandom.new([0..10, 90..100])
5.times do
puts range_random.rand
end
puts
n = 500_000
Benchmark.bm(7) do |x|
x.report('rand1:') { n.times do ; r = RangeRandom.new([ 0..1 ]); r.rand; end }
x.report('rand2:') { n.times do ; r = RangeRandom.new([ 0..1_000_000 ]); r.rand; end }
x.report('rand3:') { n.times do ; r = RangeRandom.new([ 0..1_000_000_000 ]); r.rand; end }
x.report('rand4:') { n.times do ; r = RangeRandom.new([ 0..1 ]); r.rand; end }
x.report('rand5:') { n.times do ; r = RangeRandom.new([ 0..1, 2..3, 4..5, 6..7 ]); r.rand; end }
x.report('rand6:') { r = RangeRandom.new([ 0..1 ]) ; n.times do ; r.rand; end }
x.report('rand7:') { r = RangeRandom.new([ 0..1_000_000_000 ]) ; n.times do ; r.rand; end }
end
500 000 :
# >> user system total real
# >> rand1: 2.220000 0.000000 2.220000 ( 2.224894)
# >> rand2: 2.250000 0.010000 2.260000 ( 2.254730)
# >> rand3: 2.250000 0.000000 2.250000 ( 2.247406)
500 000 :
# >> rand4: 2.220000 0.000000 2.220000 ( 2.222983)
# >> rand5: 4.340000 0.000000 4.340000 ( 4.337312)
, 500 000 :
# >> rand6: 0.560000 0.000000 0.560000 ( 0.559673)
# >> rand7: 0.580000 0.000000 0.580000 ( 0.584331)
, - . , .