mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-31 19:06:14 +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)
 | 
