require "benchmark" require "./utilities.cr" require "./db-cars.cr" # List of environment variables and default values: # ENV["CARNAME"] rescue "Corvet-#{(db_size/2).to_i}" # ENV["CARCOLOR"] rescue "red" # ENV["CARKEYWORD"] rescue "spacious" # ENV["DBSIZE"] rescue 40_000 # ENV["DBSIZE_START"] rescue 5_000 # ENV["DBSIZE_INCREMENT"] rescue 1_000 # ENV["REPORT_DIR"] rescue "results" # ENV["NBRUN"] rescue 100 class DODB::Storage(V) def empty_db while pop end end end class Context class_property report_dir = "results" end def report(storage, nb_run, name, &block) durations = run_n_times nb_run, &block File.open("#{Context.report_dir}/#{name}", "w") do |file| durations.each do |d| file.puts d end end avr = durations.reduce { |a, b| a + b } / nb_run puts "#{name}: #{avr}" avr end def prepare_env(storage, db_size, name, s_index, s_partition, s_tags, &) STDOUT.write "add #{db_size} values to #{name}\r".to_slice add_cars storage, db_size STDOUT.write " \r".to_slice yield storage, name, s_index, s_partition, s_tags storage.rm_storage_dir end def batch(db_size, nb_run) cars_ram = DODB::RAMOnlySpecDataBase(Car).new cars_cached = DODB::CachedSpecDataBase(Car).new cars_semi = DODB::SpecDataBase(Car).new "-semi" cars_uncached = DODB::SpecDataBase(Car).new ram_searchby_name, ram_searchby_color, ram_searchby_keywords = ram_indexes cars_ram cached_searchby_name, cached_searchby_color, cached_searchby_keywords = cached_indexes cars_cached semi_searchby_name, semi_searchby_color, semi_searchby_keywords = cached_indexes cars_semi uncached_searchby_name, uncached_searchby_color, uncached_searchby_keywords = uncached_indexes cars_uncached #puts "add some values" #add_cars cars_ram, db_size #add_cars cars_cached, db_size #add_cars cars_semi, db_size #add_cars cars_uncached, db_size car_name_to_search = ENV["CARNAME"] rescue "Corvet-#{(db_size/2).to_i}" car_color_to_search = ENV["CARCOLOR"] rescue "red" car_keyword_to_search = ENV["CARKEYWORD"] rescue "spacious" puts "" puts "" puts "NEW BATCH: db-size #{db_size}" puts "" puts "search by index '#{car_name_to_search}', partition '#{car_color_to_search}', tag '#{car_keyword_to_search}'" fn = ->(storage : DODB::Storage(Car), name : String, search_name : DODB::Index(Car), search_color : DODB::Partition(Car), search_keywords : DODB::Tags(Car)) { report(storage, nb_run, "#{name}_#{db_size}_index") do corvet = search_name.get car_name_to_search end report(storage, nb_run, "#{name}_#{db_size}_partitions") do corvet = search_color.get car_color_to_search end report(storage, nb_run, "#{name}_#{db_size}_tags") do corvet = search_keywords.get car_keyword_to_search end } prepare_env cars_ram, db_size, "ram_db_and_indexes", ram_searchby_name, ram_searchby_color, ram_searchby_keywords, &fn prepare_env cars_cached, db_size, "cached_db_and_indexes", cached_searchby_name, cached_searchby_color, cached_searchby_keywords, &fn prepare_env cars_semi, db_size, "semi_uncached_db_and_cached_indexes", semi_searchby_name, semi_searchby_color, semi_searchby_keywords, &fn prepare_env cars_uncached, db_size, "uncached_db_and_indexes", uncached_searchby_name, uncached_searchby_color, uncached_searchby_keywords, &fn end def perform_add(storage : DODB::Storage(Car), nb_run) corvet0 = Car.new "Corvet", "red", [ "shiny", "impressive", "fast", "elegant" ] i = 0 perform_benchmark_average nb_run, do corvet = corvet0.clone corvet.name = "Corvet-#{i}" storage << corvet i += 1 end end def batch_add(nb_run) cars_ram = DODB::RAMOnlySpecDataBase(Car).new cars_cached = DODB::CachedSpecDataBase(Car).new cars_semi = DODB::SpecDataBase(Car).new "-semi" cars_uncached = DODB::SpecDataBase(Car).new ram_searchby_name, ram_searchby_color, ram_searchby_keywords = ram_indexes cars_ram cached_searchby_name, cached_searchby_color, cached_searchby_keywords = cached_indexes cars_cached semi_searchby_name, semi_searchby_color, semi_searchby_keywords = cached_indexes cars_semi uncached_searchby_name, uncached_searchby_color, uncached_searchby_keywords = uncached_indexes cars_uncached avr = perform_add(cars_ram, nb_run) puts "(ram db and indexes) add a value (average on #{nb_run} tries): #{avr}" avr = perform_add(cars_cached, nb_run) puts "(cached db and indexes) add a value (average on #{nb_run} tries): #{avr}" avr = perform_add(cars_semi, nb_run) puts "(uncached db but cached indexes) add a value (average on #{nb_run} tries): #{avr}" avr = perform_add(cars_uncached, nb_run) puts "(uncached db and indexes) add a value (average on #{nb_run} tries): #{avr}" cars_ram.rm_storage_dir cars_cached.rm_storage_dir cars_semi.rm_storage_dir cars_uncached.rm_storage_dir end ENV["REPORT_DIR"]?.try do |report_dir| Context.report_dir = report_dir end Dir.mkdir_p Context.report_dir nb_run = ENV["NBRUN"].to_i rescue 100 db_size_max = ENV["DBSIZE"].to_i rescue 40_000 current_size = ENV["DBSIZE_START"].to_i rescue 5_000 size_increment = ENV["DBSIZE_INCREMENT"].to_i rescue 1_000 # ENV["DBSIZE"] rescue 40_000 # ENV["DBSIZE_START"] rescue 5_000 # ENV["DBSIZE_INCREMENT"] rescue 1_000 # ENV["REPORT_DIR"] rescue "results" # ENV["NBRUN"] rescue 100 pp! nb_run pp! db_size_max pp! current_size pp! size_increment while current_size <= db_size_max batch current_size, nb_run current_size += size_increment end batch_add nb_run