Created
January 18, 2012 13:28
-
-
Save rklemme/1633008 to your computer and use it in GitHub Desktop.
Couting occurrencies in an Enumerable
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$ 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