Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require 'benchmark'
- SOURCE_DATA = [
- {:name => 'host', :id => 1},
- {:name => 'problem', :id => 3},
- {:name => 'host_outage', :id => 4},
- {:name => 'host', :id => 5},
- {:name => 'host', :id => 2},
- {:name => 'host_outage', :id => 2},
- {:name => 'host', :id => 7},
- {:name => 'problem', :id => 4},
- {:name => 'host_outage', :id => 7}
- ]
- def working_base
- names = SOURCE_DATA.collect{ |a| a[:name] }
- names.uniq.collect do |n|
- {:name => n, :count => names.grep(n).size}
- end
- end
- def first_attempt
- counts = {}
- SOURCE_DATA.each do |a|
- counts[a[:name]] ||= 0
- counts[a[:name]] += 1
- end
- counts
- end
- def first_attempt_with_format
- counts = {}
- SOURCE_DATA.each do |a|
- counts[a[:name]] ||= 0
- counts[a[:name]] += 1
- end
- names = []
- counts.each_pair do |k,v|
- names << { :name => k, :count => v }
- end
- names
- end
- def second_attempt
- counts = []
- SOURCE_DATA.each do |a|
- c = counts.find { |c| c[:name] == a[:name] }
- c.nil? ? counts << { :name => a[:name], :count => 1 } : counts[counts.index(c)][:count] += 1
- end
- counts
- end
- def hendrik_1
- result = {}
- SOURCE_DATA.each do |a|
- if result[a[:name]].nil?
- result[a[:name]] = 1
- else
- result[a[:name]] = result[a[:name]] + 1
- end
- end
- result
- end
- RUNS = 10_000
- Benchmark.benchmark do |dm|
- puts ""
- dm.report { RUNS.times { working_base } }
- puts working_base.inspect
- puts ""
- dm.report { RUNS.times { first_attempt } }
- puts first_attempt.inspect
- puts ""
- dm.report { RUNS.times { first_attempt_with_format } }
- puts first_attempt_with_format.inspect
- puts ""
- dm.report { RUNS.times { second_attempt } }
- puts second_attempt.inspect
- puts ""
- dm.report { RUNS.times { hendrik_1 } }
- puts hendrik_1.inspect
- puts ""
- end
Add Comment
Please, Sign In to add comment