mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-04 04:46:15 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			129 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			Ruby
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			129 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			Ruby
		
	
	
		
			Executable file
		
	
	
	
	
#!/usr/bin/env ruby
 | 
						|
 | 
						|
require "fileutils"
 | 
						|
require "json"
 | 
						|
require "optparse"
 | 
						|
 | 
						|
class IndexingBenchmarker
 | 
						|
  def initialize
 | 
						|
    @groonga = "groonga"
 | 
						|
    @database_path = nil
 | 
						|
    @benchmark_database_dir = detect_benchmark_database_dir
 | 
						|
  end
 | 
						|
 | 
						|
  def run
 | 
						|
    catch(:run) do
 | 
						|
      parse_options!
 | 
						|
    end
 | 
						|
 | 
						|
    dump_no_indexes = dump("dump-no-indexes.grn",
 | 
						|
                           "--dump_indexes", "no")
 | 
						|
    dump_only_indexes = dump("dump-only-indexes.grn",
 | 
						|
                             "--dump_plugins", "no",
 | 
						|
                             "--dump_schema", "no",
 | 
						|
                             "--dump_records", "no",
 | 
						|
                             "--dump_configs", "no")
 | 
						|
    dump_no_records = dump("dump-no-records.grn",
 | 
						|
                           "--dump_records", "no")
 | 
						|
    dump_only_records = dump("dump-only-records.grn",
 | 
						|
                             "--dump_plugins", "no",
 | 
						|
                             "--dump_schema", "no",
 | 
						|
                             "--dump_indexes", "no",
 | 
						|
                             "--dump_configs", "no")
 | 
						|
 | 
						|
    create_benchmark_database do
 | 
						|
      p [:load_record, measure(dump_no_indexes)]
 | 
						|
      p [:static_index_creation, measure(dump_only_indexes)]
 | 
						|
    end
 | 
						|
 | 
						|
    create_benchmark_database do
 | 
						|
      p [:create_schema, measure(dump_no_records)]
 | 
						|
      p [:load_record_and_create_index, measure(dump_only_records)]
 | 
						|
    end
 | 
						|
 | 
						|
    true
 | 
						|
  end
 | 
						|
 | 
						|
  private
 | 
						|
  def detect_benchmark_database_dir
 | 
						|
    candiates = [
 | 
						|
      "/dev/shm",
 | 
						|
      "tmp",
 | 
						|
    ]
 | 
						|
    candiates.find do |candidate|
 | 
						|
      File.exist?(candidate)
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  def benchmark_database_path
 | 
						|
    "#{@benchmark_database_dir}/bench-db/db"
 | 
						|
  end
 | 
						|
 | 
						|
  def parse_options!
 | 
						|
    option_parser = OptionParser.new do |parser|
 | 
						|
      parser.banner += " SOURCE_DATABASE"
 | 
						|
 | 
						|
      parser.on("--groonga=PATH",
 | 
						|
                "Use PATH as groonga command path") do |path|
 | 
						|
        @groonga = path
 | 
						|
      end
 | 
						|
 | 
						|
      parser.on("--benchmark-database-dir=DIR",
 | 
						|
                "Use DIR to put benchmark database") do |dir|
 | 
						|
        @benchmark_database_dir = dir
 | 
						|
      end
 | 
						|
    end
 | 
						|
 | 
						|
    @database_path, = option_parser.parse!(ARGV)
 | 
						|
    if @database_path.nil?
 | 
						|
      puts(option_parser)
 | 
						|
      throw(:run)
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  def dump(path, *dump_options)
 | 
						|
    return path if File.exist?(path)
 | 
						|
    unless system(@groonga,
 | 
						|
                  @database_path,
 | 
						|
                  "dump",
 | 
						|
                  *dump_options,
 | 
						|
                  :out => path)
 | 
						|
      raise "failed to dump: #{dump_options.inspect}"
 | 
						|
    end
 | 
						|
    path
 | 
						|
  end
 | 
						|
 | 
						|
  def create_benchmark_database
 | 
						|
    dir = File.dirname(benchmark_database_path)
 | 
						|
    FileUtils.rm_rf(dir)
 | 
						|
    FileUtils.mkdir_p(dir)
 | 
						|
    system(@groonga,
 | 
						|
           "-n", benchmark_database_path,
 | 
						|
           "shutdown",
 | 
						|
           :out => IO::NULL)
 | 
						|
    begin
 | 
						|
      yield
 | 
						|
    ensure
 | 
						|
      FileUtils.rm_rf(dir)
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  def measure(dump_path)
 | 
						|
    result = "result"
 | 
						|
    begin
 | 
						|
      system(@groonga,
 | 
						|
             "--file", dump_path,
 | 
						|
             benchmark_database_path,
 | 
						|
             :out => result)
 | 
						|
      File.open(result) do |output|
 | 
						|
        output.each_line.inject(0) do |result, line|
 | 
						|
          result + JSON.parse(line)[0][2]
 | 
						|
        end
 | 
						|
      end
 | 
						|
    ensure
 | 
						|
      FileUtils.rm_f(result)
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
exit(IndexingBenchmarker.new.run)
 |