2024-05-04 23:12:32 +02:00
|
|
|
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
|
|
|
|
|
2024-05-06 18:31:52 +02:00
|
|
|
class DODBSemiCachedCars < DODB::DataBase(Car)
|
|
|
|
property storage_dir : String
|
|
|
|
def initialize(storage_ext = "", remove_previous_data = true)
|
|
|
|
@storage_dir = "test-storage-cars-semi#{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
|
|
|
|
|
2024-05-04 23:12:32 +02:00
|
|
|
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
|
|
|
|
|
2024-05-06 18:31:52 +02:00
|
|
|
def init_uncached_indexes(storage : DODB::Storage)
|
|
|
|
n = storage.new_uncached_index "name", &.name
|
|
|
|
c = storage.new_uncached_partition "color", &.color
|
|
|
|
k = storage.new_uncached_tags "keyword", &.keywords
|
|
|
|
return n, c, k
|
|
|
|
end
|
|
|
|
|
2024-05-04 23:12:32 +02:00
|
|
|
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
|
2024-05-06 18:31:52 +02:00
|
|
|
cars_semi = DODBSemiCachedCars.new
|
2024-05-04 23:12:32 +02:00
|
|
|
|
|
|
|
cached_searchby_name, cached_searchby_color, cached_searchby_keywords = init_indexes cars_cached
|
2024-05-06 18:31:52 +02:00
|
|
|
uncached_searchby_name, uncached_searchby_color, uncached_searchby_keywords = init_uncached_indexes cars_uncached
|
|
|
|
semi_searchby_name, semi_searchby_color, semi_searchby_keywords = init_indexes cars_semi
|
2024-05-04 23:12:32 +02:00
|
|
|
|
|
|
|
add_cars cars_cached, 1_000
|
|
|
|
add_cars cars_uncached, 1_000
|
2024-05-06 18:31:52 +02:00
|
|
|
add_cars cars_semi, 1_000
|
2024-05-04 23:12:32 +02:00
|
|
|
|
|
|
|
# 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
|
|
|
|
|
2024-05-06 18:31:52 +02:00
|
|
|
x.report("(cars db) searching a data with an index (semi: cache is only on index)") do
|
|
|
|
corvet = semi_searchby_name.get "Corvet-500"
|
|
|
|
end
|
|
|
|
|
2024-05-04 23:12:32 +02:00
|
|
|
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
|
|
|
|
|
2024-05-06 18:31:52 +02:00
|
|
|
x.report("(cars db) searching a data with a partition (semi: cache is only on partition)") do
|
|
|
|
red_cars = semi_searchby_color.get "red"
|
|
|
|
end
|
|
|
|
|
2024-05-04 23:12:32 +02:00
|
|
|
x.report("(cars db) searching a data with a partition (without a cache)") do
|
2024-05-05 00:43:15 +02:00
|
|
|
red_cars = uncached_searchby_color.get "red"
|
2024-05-04 23:12:32 +02:00
|
|
|
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
|
|
|
|
|
2024-05-06 18:31:52 +02:00
|
|
|
x.report("(cars db) searching a data with a tag (semi: cache is only on tags)") do
|
|
|
|
red_cars = semi_searchby_keywords.get "spacious"
|
|
|
|
end
|
|
|
|
|
2024-05-04 23:12:32 +02:00
|
|
|
x.report("(cars db) searching a data with a tag (without a cache)") do
|
2024-05-05 00:43:15 +02:00
|
|
|
red_cars = uncached_searchby_keywords.get "spacious"
|
2024-05-04 23:12:32 +02:00
|
|
|
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
|
2024-05-06 18:31:52 +02:00
|
|
|
uncached_searchby_name, uncached_searchby_color, uncached_searchby_keywords = init_uncached_indexes cars_uncached
|
2024-05-04 23:12:32 +02:00
|
|
|
|
|
|
|
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
|
2024-05-06 18:31:52 +02:00
|
|
|
cars_semi.rm_storage_dir
|