Commit 2d0ceffb0977c6e0ac49c989de66788b1ae6edf0

Authored by Andrew
1 parent a75e2c0f

Updated benchmark scripts [skip ci]

Rakefile
... ... @@ -16,5 +16,5 @@ Rake::TestTask.new do |t|
16 16 end
17 17  
18 18 task :benchmark do
19   - require_relative "benchmark/benchmark"
  19 + require_relative "benchmark/index"
20 20 end
... ...
benchmark/Gemfile
... ... @@ -3,7 +3,7 @@ source "https://rubygems.org"
3 3 # Specify your gem's dependencies in searchkick.gemspec
4 4 gemspec path: "../"
5 5  
6   -# gem "sqlite3"
  6 +gem "sqlite3"
7 7 gem "pg"
8 8 gem "activerecord", "~> 5.2.0.rc1"
9 9 gem "activerecord-import"
... ...
benchmark/benchmark.rb
... ... @@ -1,98 +0,0 @@
1   -require "bundler/setup"
2   -Bundler.require(:default)
3   -require "active_record"
4   -require "benchmark"
5   -require "active_support/notifications"
6   -
7   -ActiveSupport::Notifications.subscribe "request.searchkick" do |*args|
8   - event = ActiveSupport::Notifications::Event.new(*args)
9   - p event.duration.round
10   -end
11   -
12   -ActiveJob::Base.queue_adapter = :sidekiq
13   -
14   -Searchkick.redis = Redis.new
15   -
16   -ActiveRecord::Base.default_timezone = :utc
17   -ActiveRecord::Base.time_zone_aware_attributes = true
18   -# ActiveRecord::Base.establish_connection adapter: "sqlite3", database: "/tmp/searchkick"
19   -ActiveRecord::Base.establish_connection "postgresql://localhost/searchkick_demo_development"
20   -# ActiveRecord::Base.logger = Logger.new(STDOUT)
21   -
22   -ActiveJob::Base.logger = nil
23   -
24   -class Product < ActiveRecord::Base
25   - searchkick batch_size: 1000
26   -
27   - def search_data
28   - {
29   - name: name,
30   - color: color,
31   - store_id: store_id
32   - }
33   - end
34   -end
35   -
36   -# total_docs = 100000
37   -
38   -# ActiveRecord::Migration.create_table :products, force: :cascade do |t|
39   -# t.string :name
40   -# t.string :color
41   -# t.integer :store_id
42   -# end
43   -
44   -# Product.import ["name", "color", "store_id"], total_docs.times.map { |i| ["Product #{i}", ["red", "blue"].sample, rand(10)] }
45   -
46   -# puts "Imported"
47   -
48   -result = nil
49   -report = nil
50   -stats = nil
51   -
52   -Product.searchkick_index.delete rescue nil
53   -
54   -GC.start
55   -GC.disable
56   -start_mem = GetProcessMem.new.mb
57   -
58   -time =
59   - Benchmark.realtime do
60   - # result = RubyProf.profile do
61   - # report = MemoryProfiler.report do
62   - # stats = AllocationStats.trace do
63   - reindex = Product.reindex #(async: true)
64   - # p reindex
65   - # end
66   -
67   - # 60.times do |i|
68   - # if reindex.is_a?(Hash)
69   - # docs = Searchkick::Index.new(reindex[:index_name]).total_docs
70   - # else
71   - # docs = Product.searchkick_index.total_docs
72   - # end
73   - # puts "#{i}: #{docs}"
74   - # if docs == total_docs
75   - # break
76   - # end
77   - # p Searchkick.reindex_status(reindex[:index_name]) if reindex.is_a?(Hash)
78   - # sleep(1)
79   - # # Product.searchkick_index.refresh
80   - # end
81   - end
82   -
83   -puts
84   -puts "Memory: #{(GetProcessMem.new.mb - start_mem).round(1)}mb"
85   -puts "Time: #{time.round(1)}s"
86   -
87   -if result
88   - printer = RubyProf::GraphPrinter.new(result)
89   - printer.print(STDOUT, min_percent: 5)
90   -end
91   -
92   -if report
93   - puts report.pretty_print
94   -end
95   -
96   -if stats
97   - puts result.allocations(alias_paths: true).group_by(:sourcefile, :class).to_text
98   -end
benchmark/index.rb 0 → 100644
... ... @@ -0,0 +1,98 @@
  1 +require "bundler/setup"
  2 +Bundler.require(:default)
  3 +require "active_record"
  4 +require "benchmark"
  5 +require "active_support/notifications"
  6 +
  7 +ActiveSupport::Notifications.subscribe "request.searchkick" do |*args|
  8 + event = ActiveSupport::Notifications::Event.new(*args)
  9 + p event.duration.round
  10 +end
  11 +
  12 +ActiveJob::Base.queue_adapter = :sidekiq
  13 +
  14 +Searchkick.redis = Redis.new
  15 +
  16 +ActiveRecord::Base.default_timezone = :utc
  17 +ActiveRecord::Base.time_zone_aware_attributes = true
  18 +# ActiveRecord::Base.establish_connection adapter: "sqlite3", database: "/tmp/searchkick"
  19 +ActiveRecord::Base.establish_connection "postgresql://localhost/searchkick_demo_development"
  20 +# ActiveRecord::Base.logger = Logger.new(STDOUT)
  21 +
  22 +ActiveJob::Base.logger = nil
  23 +
  24 +class Product < ActiveRecord::Base
  25 + searchkick batch_size: 1000
  26 +
  27 + def search_data
  28 + {
  29 + name: name,
  30 + color: color,
  31 + store_id: store_id
  32 + }
  33 + end
  34 +end
  35 +
  36 +# total_docs = 100000
  37 +
  38 +# ActiveRecord::Migration.create_table :products, force: :cascade do |t|
  39 +# t.string :name
  40 +# t.string :color
  41 +# t.integer :store_id
  42 +# end
  43 +
  44 +# Product.import ["name", "color", "store_id"], total_docs.times.map { |i| ["Product #{i}", ["red", "blue"].sample, rand(10)] }
  45 +
  46 +# puts "Imported"
  47 +
  48 +result = nil
  49 +report = nil
  50 +stats = nil
  51 +
  52 +Product.searchkick_index.delete rescue nil
  53 +
  54 +GC.start
  55 +GC.disable
  56 +start_mem = GetProcessMem.new.mb
  57 +
  58 +time =
  59 + Benchmark.realtime do
  60 + # result = RubyProf.profile do
  61 + # report = MemoryProfiler.report do
  62 + # stats = AllocationStats.trace do
  63 + reindex = Product.reindex #(async: true)
  64 + # p reindex
  65 + # end
  66 +
  67 + # 60.times do |i|
  68 + # if reindex.is_a?(Hash)
  69 + # docs = Searchkick::Index.new(reindex[:index_name]).total_docs
  70 + # else
  71 + # docs = Product.searchkick_index.total_docs
  72 + # end
  73 + # puts "#{i}: #{docs}"
  74 + # if docs == total_docs
  75 + # break
  76 + # end
  77 + # p Searchkick.reindex_status(reindex[:index_name]) if reindex.is_a?(Hash)
  78 + # sleep(1)
  79 + # # Product.searchkick_index.refresh
  80 + # end
  81 + end
  82 +
  83 +puts
  84 +puts "Memory: #{(GetProcessMem.new.mb - start_mem).round(1)}mb"
  85 +puts "Time: #{time.round(1)}s"
  86 +
  87 +if result
  88 + printer = RubyProf::GraphPrinter.new(result)
  89 + printer.print(STDOUT, min_percent: 5)
  90 +end
  91 +
  92 +if report
  93 + puts report.pretty_print
  94 +end
  95 +
  96 +if stats
  97 + puts result.allocations(alias_paths: true).group_by(:sourcefile, :class).to_text
  98 +end
... ...
benchmark/search.rb 0 → 100644
... ... @@ -0,0 +1,42 @@
  1 +require "bundler/setup"
  2 +Bundler.require(:default)
  3 +require "active_record"
  4 +require "benchmark"
  5 +
  6 +ActiveRecord::Base.default_timezone = :utc
  7 +ActiveRecord::Base.time_zone_aware_attributes = true
  8 +ActiveRecord::Base.establish_connection adapter: "sqlite3", database: "/tmp/searchkick"
  9 +
  10 +class Product < ActiveRecord::Base
  11 + searchkick batch_size: 1000
  12 +
  13 + def search_data
  14 + {
  15 + name: name,
  16 + color: color,
  17 + store_id: store_id
  18 + }
  19 + end
  20 +end
  21 +
  22 +# total_docs = 1000000
  23 +
  24 +# ActiveRecord::Migration.create_table :products, force: :cascade do |t|
  25 +# t.string :name
  26 +# t.string :color
  27 +# t.integer :store_id
  28 +# end
  29 +
  30 +# Product.import ["name", "color", "store_id"], total_docs.times.map { |i| ["Product #{i}", ["red", "blue"].sample, rand(10)] }
  31 +
  32 +# puts "Imported"
  33 +
  34 +# Product.reindex
  35 +
  36 +time =
  37 + Benchmark.realtime do
  38 + Product.search("product", fields: [:name], where: {color: "red", store_id: 5}, load: false)
  39 + end
  40 +
  41 +puts
  42 +puts "Time: #{time.round(1)}s"
... ...