require "benchmark" require "./benchmark-utilities.cr" require "../src/dodb.cr" require "./test-data.cr" class DODBCachedCars < DODB::CachedDataBase(Car) property storage_dir : String def initialize(storage_ext = "", remove_previous_data = true) @storage_dir = "test-storage-cars-cached#{storage_ext}" if remove_previous_data ::FileUtils.rm_rf storage_dir end super storage_dir end def rm_storage_dir ::FileUtils.rm_rf @storage_dir end end class DODBUnCachedCars < DODB::DataBase(Car) property storage_dir : String def initialize(storage_ext = "", remove_previous_data = true) @storage_dir = "test-storage-cars-uncached#{storage_ext}" if remove_previous_data ::FileUtils.rm_rf storage_dir end super storage_dir end def rm_storage_dir ::FileUtils.rm_rf @storage_dir end end def init_indexes(storage : DODB::Storage) n = storage.new_index "name", &.name c = storage.new_partition "color", &.color k = storage.new_tags "keyword", &.keywords return n, c, k end def add_cars(storage : DODB::Storage, nb_iterations : Int32) i = 0 car1 = Car.new "Corvet", "red", [ "shiny", "impressive", "fast", "elegant" ] car2 = Car.new "Bullet-GT", "blue", [ "shiny", "fast", "expensive" ] car3 = Car.new "Deudeuche", "beige", [ "curvy", "sublime" ] car4 = Car.new "Ford-5", "red", [ "unknown" ] car5 = Car.new "C-MAX", "gray", [ "spacious", "affordable" ] while i < nb_iterations car1.name = "Corvet-#{i}" car2.name = "Bullet-GT-#{i}" car3.name = "Deudeuche-#{i}" car4.name = "Ford-5-#{i}" car5.name = "C-MAX-#{i}" storage << car1 storage << car2 storage << car3 storage << car4 storage << car5 i += 1 STDOUT.write "\radding value #{i}".to_slice end puts "" end cars_cached = DODBCachedCars.new cars_uncached = DODBUnCachedCars.new cached_searchby_name, cached_searchby_color, cached_searchby_keywords = init_indexes cars_cached uncached_searchby_name, uncached_searchby_color, uncached_searchby_keywords = init_indexes cars_uncached add_cars cars_cached, 1_000 add_cars cars_uncached, 1_000 # Searching for data with an index. Benchmark.ips do |x| x.report("(cars db) searching a data with an index (with a cache)") do corvet = cached_searchby_name.get "Corvet-500" end x.report("(cars db) searching a data with an index (without a cache)") do corvet = uncached_searchby_name.get "Corvet-500" end end # Searching for data with a partition. Benchmark.ips do |x| x.report("(cars db) searching a data with a partition (with a cache)") do red_cars = cached_searchby_color.get "red" end x.report("(cars db) searching a data with a partition (without a cache)") do red_cars = uncached_searchby_color.get "red" end end # Searching for data with a tag. Benchmark.ips do |x| x.report("(cars db) searching a data with a tag (with a cache)") do red_cars = cached_searchby_keywords.get "spacious" end x.report("(cars db) searching a data with a tag (without a cache)") do red_cars = uncached_searchby_keywords.get "spacious" end end cars_cached.rm_storage_dir cars_uncached.rm_storage_dir cars_cached = DODBCachedCars.new cars_uncached = DODBUnCachedCars.new #init_indexes cars_cached #init_indexes cars_uncached cached_searchby_name, cached_searchby_color, cached_searchby_keywords = init_indexes cars_cached uncached_searchby_name, uncached_searchby_color, uncached_searchby_keywords = init_indexes cars_uncached add_cars cars_cached, 1_000 add_cars cars_uncached, 1_000 nb_run = 1000 perform_benchmark_average_verbose "(cached) search db with an index", nb_run, do cached_searchby_name.get "Corvet-500" end perform_benchmark_average_verbose "(uncached) search db with an index", nb_run, do uncached_searchby_name.get "Corvet-500" end cars_cached.rm_storage_dir cars_uncached.rm_storage_dir