Advertisement
Guest User

Untitled

a guest
Sep 3rd, 2015
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.00 KB | None | 0 0
  1. #!/usr/bin/env ruby
  2. require 'benchmark'
  3.  
  4. class Finder
  5. MAX = {
  6. money: 1_000_000,
  7. index: 1_000_000,
  8. high: 300,
  9. age: 100,
  10. gender: 2
  11. }
  12. def initialize(arr)
  13. @arr = arr
  14. @default = {
  15. money: 1_000_000,
  16. index: 1_000_000,
  17. high: 300,
  18. age: 100,
  19. gender: 2
  20. }
  21. end
  22.  
  23. def search(params = {})
  24. return @arr if params.empty?
  25. sorted_params(params).inject(@arr) {|arr, h| arr.select{|p| filter(p,h[0],h[1])}}
  26. end
  27.  
  28. ### Only for becnhmark
  29. def find(params = {})
  30. return @arr if params.empty?
  31. params.to_a.inject(@arr) {|arr, h| arr.select{|p| filter(p,h[0],h[1])}}
  32. end
  33.  
  34. def filter(obj, key, val)
  35. val.is_a?(Range) ? val.cover?(obj[key]) : val == obj[key]
  36. end
  37.  
  38. def sorted_params(params)
  39. args = params.to_a
  40. return args if params.length < 2
  41. args.sort_by! do |x|
  42. -MAX[x[0]] / (x[1].is_a?(Range) ? x[1].count : 1)
  43. end
  44. end
  45. end
  46.  
  47. Person = Struct.new(:money, :index, :high, :age, :gender)
  48. arr = [Person.new(400, 1000, 200, 30, 1)]
  49. 1000000.times do
  50. arr << Person.new(
  51. rand(Finder::MAX[:money]),
  52. rand(Finder::MAX[:index]),
  53. rand(Finder::MAX[:high]),
  54. rand(Finder::MAX[:age]),
  55. rand(Finder::MAX[:gender])
  56. )
  57. end
  58.  
  59. Benchmark.bm do |x|
  60. x.report('find') do
  61. 10.times do
  62. Finder.new(arr).find(gender: 1, age: 30, money: (100..500), index: (900..2000))
  63. end
  64. end
  65. x.report('search') do
  66. 10.times do
  67. Finder.new(arr).search(gender: 1, age: 30, money: (100..500), index: (900..2000))
  68. end
  69. end
  70. x.report('find_small') do
  71. 10.times do
  72. Finder.new(arr).find(gender: 1, index: (900..2000))
  73. end
  74. end
  75. x.report('search_small') do
  76. 10.times do
  77. Finder.new(arr).search(gender: 1, index: (900..2000))
  78. end
  79. end
  80. x.report('find_empty') do
  81. 10.times do
  82. Finder.new(arr).find(gender: 1, index: 1_000_001)
  83. end
  84. end
  85. x.report('search_empty') do
  86. 10.times do
  87. Finder.new(arr).search(gender: 1, index: 1_000_001)
  88. end
  89. end
  90. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement