// Tests for bloom filter performance. #include "main.h" #include #include #include #include #include #define BIN_SEARCH 0 #define BTREE_SEARCH 1 #define MEMTABLE_SIZE 1 #define MAX_EXPERIMENT_SIZE 1024 #define BUFFER_SIZE 10 #define BLOOMFILTER_BITS 5 double bloom_test() { std::cout << "Running Bloom Filter experiments. \n"; std::filesystem::remove_all("db_t"); int data_volume_mb = 64; int mem_size_mb = MEMTABLE_SIZE; int mem_size = (mem_size_mb * 1024 * 1024) / (2 * sizeof(int)); int buffer_size = BUFFER_SIZE * 256; // assuming 4KB pages DB* db = Open("db_t", mem_size, buffer_size, buffer_size, BTREE_SEARCH, BLOOMFILTER_BITS); int num_kv = (data_volume_mb * 1024 * 1024) / (2 * sizeof(int)); //8,388,608 std::cout << "Populating the database...\n"; for (int i = 0; i < num_kv; i++){ db->put(i,-i); } std::cout << "Database populated, starting test...\n"; auto real_start_deep = std::chrono::high_resolution_clock::now(); for (int i = 0; i < 100; i++){ db->get(i); // get from the deepest level } auto real_end_deep = std::chrono::high_resolution_clock::now(); auto real_start_filter = std::chrono::high_resolution_clock::now(); for (int i = 0; i < 100; i++){ db->get(8388610 + i); // get non-existing values } auto real_end_filter = std::chrono::high_resolution_clock::now(); double real_time_taken_deep = (std::chrono::duration_cast(real_end_deep - real_start_deep).count())/1000000.0; std::cout << "Getting from the deepest level. Time taken: " << real_time_taken_deep << " seconds \n"; double real_time_taken = (std::chrono::duration_cast(real_end_filter - real_start_filter).count())/1000000.0; std::cout << "Getting non-existing values, should be filtered. Time taken: " << real_time_taken << " seconds \n"; db->Close(); // std::cout << "All tests ended\n\n"; std::filesystem::remove_all("db_t"); return real_time_taken; } int main(){ bloom_test(); return 0; }