benchmark.rb 2.17 KB
require "bundler/setup"
Bundler.require(:default)
require "active_record"
require "benchmark"
require "active_support/notifications"

ActiveSupport::Notifications.subscribe "request.searchkick" do |*args|
  event = ActiveSupport::Notifications::Event.new(*args)
  p event.duration
end

ActiveJob::Base.queue_adapter = :sidekiq

Searchkick.redis = Redis.new

ActiveRecord::Base.default_timezone = :utc
ActiveRecord::Base.time_zone_aware_attributes = true
# ActiveRecord::Base.establish_connection adapter: "sqlite3", database: "/tmp/searchkick"
ActiveRecord::Base.establish_connection "postgresql://localhost/searchkick_demo_development"
# ActiveRecord::Base.logger = Logger.new(STDOUT)

ActiveJob::Base.logger = nil

class Product < ActiveRecord::Base
  searchkick batch_size: 1000

  def search_data
    {
      name: name,
      color: color,
      store_id: store_id
    }
  end
end

total_docs = 100000

# ActiveRecord::Migration.create_table :products, force: :cascade do |t|
#   t.string :name
#   t.string :color
#   t.integer :store_id
# end

# Product.import ["name", "color", "store_id"], total_docs.times.map { |i| ["Product #{i}", ["red", "blue"].sample, rand(10)] }

puts "Imported"

result = nil
report = nil
stats = nil

# p GetProcessMem.new.mb

Product.searchkick_index.delete rescue nil

time =
  Benchmark.realtime do
    # result = RubyProf.profile do
    # report = MemoryProfiler.report do
    # stats = AllocationStats.trace do
    reindex = Product.reindex(async: true)
    p reindex
    # end

    60.times do |i|
      if reindex.is_a?(Hash)
        docs = Searchkick::Index.new(reindex[:index_name]).total_docs
      else
        docs = Product.searchkick_index.total_docs
      end
      puts "#{i}: #{docs}"
      if docs == total_docs
        break
      end
      p Searchkick.reindex_status(reindex[:index_name]) if reindex.is_a?(Hash)
      sleep(1)
      # Product.searchkick_index.refresh
    end
  end

# p GetProcessMem.new.mb

puts time.round(1)


if result
  printer = RubyProf::GraphPrinter.new(result)
  printer.print(STDOUT, min_percent: 5)
end

if report
  puts report.pretty_print
end

if stats
  puts result.allocations(alias_paths: true).group_by(:sourcefile, :class).to_text
end