Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env ruby
- require 'benchmark'
- class Finder
- MAX = {
- money: 1_000_000,
- index: 1_000_000,
- high: 300,
- age: 100,
- gender: 2
- }
- def initialize(arr)
- @arr = arr
- @default = {
- money: 1_000_000,
- index: 1_000_000,
- high: 300,
- age: 100,
- gender: 2
- }
- end
- def search(params = {})
- return @arr if params.empty?
- sorted_params(params).inject(@arr) {|arr, h| arr.select{|p| filter(p,h[0],h[1])}}
- end
- ### Only for becnhmark
- def find(params = {})
- return @arr if params.empty?
- params.to_a.inject(@arr) {|arr, h| arr.select{|p| filter(p,h[0],h[1])}}
- end
- def filter(obj, key, val)
- val.is_a?(Range) ? val.cover?(obj[key]) : val == obj[key]
- end
- def sorted_params(params)
- args = params.to_a
- return args if params.length < 2
- args.sort_by! do |x|
- -MAX[x[0]] / (x[1].is_a?(Range) ? x[1].count : 1)
- end
- end
- end
- Person = Struct.new(:money, :index, :high, :age, :gender)
- arr = [Person.new(400, 1000, 200, 30, 1)]
- 1000000.times do
- arr << Person.new(
- rand(Finder::MAX[:money]),
- rand(Finder::MAX[:index]),
- rand(Finder::MAX[:high]),
- rand(Finder::MAX[:age]),
- rand(Finder::MAX[:gender])
- )
- end
- Benchmark.bm do |x|
- x.report('find') do
- 10.times do
- Finder.new(arr).find(gender: 1, age: 30, money: (100..500), index: (900..2000))
- end
- end
- x.report('search') do
- 10.times do
- Finder.new(arr).search(gender: 1, age: 30, money: (100..500), index: (900..2000))
- end
- end
- x.report('find_small') do
- 10.times do
- Finder.new(arr).find(gender: 1, index: (900..2000))
- end
- end
- x.report('search_small') do
- 10.times do
- Finder.new(arr).search(gender: 1, index: (900..2000))
- end
- end
- x.report('find_empty') do
- 10.times do
- Finder.new(arr).find(gender: 1, index: 1_000_001)
- end
- end
- x.report('search_empty') do
- 10.times do
- Finder.new(arr).search(gender: 1, index: 1_000_001)
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement