Skip to content

Instantly share code, notes, and snippets.

@rklemme
Created January 18, 2012 13:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rklemme/1633008 to your computer and use it in GitHub Desktop.
Save rklemme/1633008 to your computer and use it in GitHub Desktop.
Couting occurrencies in an Enumerable
require 'benchmark'
# create some data
DAT = (3..7).map do |i|
Array.new(10 ** i) { rand 100 }
end
2.times do
Benchmark.bm 15 do |b|
DAT.each do |ar|
n = [1000000 / ar.size, 10].max
printf "Size %10d n=%10d\n", ar.size, n
b.report("Ralph Shneiver:"){ n.times { result = Hash.new(0); ar.each { |x| result[x] += 1 }; result} }
b.report("Sigurd:") { n.times { ar.inject(Hash.new(0)) {|res, x| res[x] += 1; res } } }
b.report("Keinich #1") { n.times { Hash[ar.group_by{|n|n}.map{|k,v|[k, v.size]}] } }
b.report("RK #1") { n.times { ar.group_by{|n|n}.tap {|h|h.each{|k,v|h[k]=v.size}} } }
b.report("Keinich #2") { n.times { Hash.new(0).tap{|h|ar.each{|n|h[n] += 1}} } }
b.report("Magnus Holm:") { n.times { ar.each_with_object(Hash.new(0)) { |x, res| res[x] += 1 } } }
b.report("Abinoam #1:") { n.times { Hash[ar.sort.chunk {|n| n}.map {|ix, els| [ix, els.size] } ] } }
end
end
end
$ ruby19 bm.rb
user system total real
Size 1000 n= 1000
Ralph Shneiver: 0.344000 0.000000 0.344000 ( 0.347000)
Sigurd: 0.422000 0.000000 0.422000 ( 0.410000)
Keinich #1 1.765000 0.000000 1.765000 ( 1.767000)
RK #1 1.188000 0.000000 1.188000 ( 1.194000)
Keinich #2 0.390000 0.000000 0.390000 ( 0.395000)
Magnus Holm: 0.500000 0.000000 0.500000 ( 0.492000)
Abinoam #1: 2.360000 0.000000 2.360000 ( 2.354000)
Size 10000 n= 100
Ralph Shneiver: 0.359000 0.000000 0.359000 ( 0.365000)
Sigurd: 0.375000 0.000000 0.375000 ( 0.374000)
Keinich #1 0.375000 0.000000 0.375000 ( 0.381000)
RK #1 0.438000 0.000000 0.438000 ( 0.428000)
Keinich #2 0.312000 0.000000 0.312000 ( 0.316000)
Magnus Holm: 0.375000 0.000000 0.375000 ( 0.378000)
Abinoam #1: 0.625000 0.000000 0.625000 ( 0.619000)
Size 100000 n= 10
Ralph Shneiver: 0.313000 0.000000 0.313000 ( 0.310000)
Sigurd: 0.375000 0.000000 0.375000 ( 0.371000)
Keinich #1 0.343000 0.000000 0.343000 ( 0.357000)
RK #1 0.313000 0.000000 0.313000 ( 0.306000)
Keinich #2 0.312000 0.000000 0.312000 ( 0.317000)
Magnus Holm: 0.391000 0.000000 0.391000 ( 0.383000)
Abinoam #1: 0.484000 0.000000 0.484000 ( 0.486000)
Size 1000000 n= 10
Ralph Shneiver: 3.125000 0.000000 3.125000 ( 3.126000)
Sigurd: 3.750000 0.000000 3.750000 ( 3.748000)
Keinich #1 2.797000 0.016000 2.813000 ( 2.814000)
RK #1 2.797000 0.000000 2.797000 ( 2.792000)
Keinich #2 3.172000 0.000000 3.172000 ( 3.182000)
Magnus Holm: 3.844000 0.000000 3.844000 ( 3.845000)
Abinoam #1: 4.718000 0.016000 4.734000 ( 4.730000)
Size 10000000 n= 10
Ralph Shneiver: 31.329000 0.000000 31.329000 ( 31.324000)
Sigurd: 37.640000 0.000000 37.640000 ( 37.679000)
Keinich #1 26.438000 0.375000 26.813000 ( 26.846000)
RK #1 26.343000 0.203000 26.546000 ( 26.591000)
Keinich #2 31.718000 0.000000 31.718000 ( 31.709000)
Magnus Holm: 38.641000 0.000000 38.641000 ( 38.661000)
Abinoam #1: 44.531000 0.344000 44.875000 ( 44.869000)
user system total real
Size 1000 n= 1000
Ralph Shneiver: 0.344000 0.000000 0.344000 ( 0.343000)
Sigurd: 0.406000 0.000000 0.406000 ( 0.409000)
Keinich #1 1.703000 0.016000 1.719000 ( 1.728000)
RK #1 1.250000 0.000000 1.250000 ( 1.245000)
Keinich #2 0.344000 0.000000 0.344000 ( 0.349000)
Magnus Holm: 0.422000 0.000000 0.422000 ( 0.410000)
Abinoam #1: 2.406000 0.000000 2.406000 ( 2.415000)
Size 10000 n= 100
Ralph Shneiver: 0.313000 0.000000 0.313000 ( 0.313000)
Sigurd: 0.375000 0.000000 0.375000 ( 0.374000)
Keinich #1 0.437000 0.000000 0.437000 ( 0.438000)
RK #1 0.328000 0.000000 0.328000 ( 0.333000)
Keinich #2 0.329000 0.000000 0.329000 ( 0.317000)
Magnus Holm: 0.375000 0.000000 0.375000 ( 0.378000)
Abinoam #1: 0.671000 0.000000 0.671000 ( 0.667000)
Size 100000 n= 10
Ralph Shneiver: 0.313000 0.000000 0.313000 ( 0.315000)
Sigurd: 0.375000 0.000000 0.375000 ( 0.376000)
Keinich #1 0.297000 0.000000 0.297000 ( 0.306000)
RK #1 0.265000 0.000000 0.265000 ( 0.257000)
Keinich #2 0.313000 0.000000 0.313000 ( 0.319000)
Magnus Holm: 0.391000 0.000000 0.391000 ( 0.381000)
Abinoam #1: 0.421000 0.000000 0.421000 ( 0.432000)
Size 1000000 n= 10
Ralph Shneiver: 3.110000 0.000000 3.110000 ( 3.104000)
Sigurd: 3.734000 0.000000 3.734000 ( 3.730000)
Keinich #1 2.594000 0.015000 2.609000 ( 2.608000)
RK #1 2.609000 0.000000 2.609000 ( 2.607000)
Keinich #2 3.172000 0.000000 3.172000 ( 3.175000)
Magnus Holm: 3.844000 0.000000 3.844000 ( 3.844000)
Abinoam #1: 4.391000 0.000000 4.391000 ( 4.392000)
Size 10000000 n= 10
Ralph Shneiver: 31.296000 0.000000 31.296000 ( 31.304000)
Sigurd: 37.407000 0.000000 37.407000 ( 37.402000)
Keinich #1 26.187000 0.125000 26.312000 ( 26.313000)
RK #1 26.063000 0.203000 26.266000 ( 26.277000)
Keinich #2 31.734000 0.000000 31.734000 ( 31.798000)
Magnus Holm: 38.281000 0.000000 38.281000 ( 38.275000)
Abinoam #1: 43.688000 0.594000 44.282000 ( 44.387000)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment