# hashtables in Ruby require "benchmark" maxiter = 10000000 ht = Hash.new durationMeas = [] durationSum = 0.0 10.step(1,-1) do |n| duration = Benchmark.realtime do ht.clear maxiter.step(1,-1) {|i| ht[i] = Float(i+n)} end durationSum = durationSum + duration durationMeas.push duration puts n end adjustment = Benchmark.realtime do maxiter.step(1,-1) {|i| Float(i+3)} end mean = durationSum/10.0 stdv = Math.sqrt(durationMeas.inject(0.0) {|var, m| var + (m-mean)**2}/10.0) printf("insert time (ordered) in seconds: mean %.3f, adj-mean %.3f, stdv %.3f\n", mean, mean-adjustment,stdv) Accum = Struct.new(:lfsr, :x) duration = Benchmark.realtime do (1..maxiter).inject(Accum.new(1,0.0)) { |a,i| nlfsr = (a.lfsr >> 1) ^ (0 - (a.lfsr & 1) & 0xd0000001); val = ht[nlfsr]; nx = a.x + (val.nil? ? 0 : val); a.lfsr = nlfsr; a.x = nx; a } end adjustment = Benchmark.realtime do (1..maxiter).inject(Accum.new(1,0.0)) { |a,i| nlfsr = (a.lfsr >> 1) ^ (0 - (a.lfsr & 1) & 0xd0000001); val = 0; nx = a.x + (val.nil? ? 0 : val); a.lfsr = nlfsr; a.x = nx; a } end printf("lookup timing (mostly misses) in seconds: %.3f, adj %.3f\n", duration, duration-adjustment) durationMeas = [] durationSum = 0.0 10.step(1,-1) do |n| duration = Benchmark.realtime do ht.clear (1..maxiter).inject(1) { |lfsr,i| nlfsr = (lfsr >> 1) ^ (0 - (lfsr & 1) & 0xd0000001); ht[nlfsr] = Float(i+n); nlfsr; } end durationSum = durationSum + duration durationMeas.push duration puts n end adjustment = Benchmark.realtime do (1..maxiter).inject(1) { |lfsr,i| nlfsr = (lfsr >> 1) ^ (0 - (lfsr & 1) & 0xd0000001); Float(i+3); nlfsr; } end mean = durationSum/10.0 stdv = Math.sqrt(durationMeas.inject(0.0) {|var, m| var + (m-mean)**2}/10.0) printf("insert time (unordered) in seconds: mean %.3f, adj-mean %.3f, stdv %.3f\n", mean, mean-adjustment, stdv) duration = Benchmark.realtime do (1..maxiter).inject(Accum.new(1,0.0)) { |a,i| nlfsr = (a.lfsr >> 1) ^ (0 - (a.lfsr & 1) & 0xd0000001); val = ht[nlfsr]; nx = a.x + (val.nil? ? 0 : val); a.lfsr = nlfsr; a.x = nx; a } end adjustment = Benchmark.realtime do (1..maxiter).inject(Accum.new(1,0.0)) { |a,i| nlfsr = (a.lfsr >> 1) ^ (0 - (a.lfsr & 1) & 0xd0000001); val = 0; nx = a.x + (val.nil? ? 0 : val); a.lfsr = nlfsr; a.x = nx; a } end printf("lookup timing (no misses) in seconds: %.3f, adj %.3f\n", duration, duration-adjustment);