#include #include #include #include #include #include "bloom_filter.hpp" #include "concurrent_bloom_map.hpp" #include "utils/hashing/fnv64.hpp" #include "utils/random/random_generator.hpp" /* ConcurrentMap Benchmark Test: - tests time of Insertion, Contain and Delete operations - benchmarking time per operation - test run ConcurrentMap with the following keys and values: - - - - */ using utils::random::NumberGenerator; using utils::random::PairGenerator; using utils::random::StringGenerator; using StringHashFunction = std::function; using IntegerGenerator = NumberGenerator, std::default_random_engine, int>; DEFINE_int32(start, 0, "Range start"); DEFINE_int32(end, 1000000000, "Range end"); DEFINE_int32(threads, 1, "Number of threads"); DEFINE_int32(string_length, 128, "String length"); // Global arguments int MAX_ELEMENTS = 1 << 18, MULTIPLIER = 2; int THREADS, RANGE_START, RANGE_END, STRING_LENGTH; /* ConcurrentMap Insertion Benchmark Test */ template static void InsertValue(benchmark::State &state, ConcurrentBloomMap *map, const std::vector> &elements) { while (state.KeepRunning()) { for (int start = 0; start < state.range(0); start++) { map->insert(elements[start].first, elements[start].second); } } state.SetComplexityN(state.range(0)); } /* ConcurrentMap Contains Benchmark Test */ template static void ContainsValue(benchmark::State &state, ConcurrentBloomMap *map, const std::vector> elements) { while (state.KeepRunning()) { for (int start = 0; start < state.range(0); start++) { map->contains(elements[start].first); } } state.SetComplexityN(state.range(0)); } auto BM_InsertValue = [](benchmark::State &state, auto *map, auto &elements) { InsertValue(state, map, elements); }; auto BM_ContainsValue = [](benchmark::State &state, auto *map, auto elements) { ContainsValue(state, map, elements); }; /* Commandline Argument Parsing Arguments: * Integer Range Minimum -start number * Integer Range Maximum - end number * Number of threads - threads number * Random String lenght -string-length number */ void parse_arguments() { RANGE_START = FLAGS_start; RANGE_END = FLAGS_end; THREADS = std::min(FLAGS_threads, static_cast(std::thread::hardware_concurrency())); STRING_LENGTH = FLAGS_string_length; } int main(int argc, char **argv) { benchmark::Initialize(&argc, argv); parse_arguments(); google::InitGoogleLogging(argv[0]); StringGenerator sg(STRING_LENGTH); IntegerGenerator ig(RANGE_START, RANGE_END); /* Creates RandomGenerators, ConcurentMaps and Random Element Vectors for the following use cases: Map elements contain keys and value for: , */ // random generators for tests PairGenerator piig(&ig, &ig); PairGenerator pssg(&sg, &sg); PairGenerator psig(&sg, &ig); PairGenerator pisg(&ig, &sg); StringHashFunction hash1 = fnv64; StringHashFunction hash2 = fnv1a64; std::vector funcs = {hash1, hash2}; BloomFilter bloom_filter_(funcs); // maps used for testing // ConcurrentBloomMap ii_map; // ConcurrentBloomMap is_map; using Filter = BloomFilter; ConcurrentBloomMap si_map(bloom_filter_); ConcurrentBloomMap ss_map(bloom_filter_); // random elements for testing // auto ii_elems = utils::random::generate_vector(piig, MAX_ELEMENTS); // auto is_elems = utils::random::generate_vector(pisg, MAX_ELEMENTS); auto si_elems = utils::random::generate_vector(psig, MAX_ELEMENTS); auto ss_elems = utils::random::generate_vector(pssg, MAX_ELEMENTS); /* insertion Tests */ benchmark::RegisterBenchmark("InsertValue[String, Int]", BM_InsertValue, &si_map, si_elems) ->RangeMultiplier(MULTIPLIER) ->Range(1, MAX_ELEMENTS) ->Complexity(benchmark::oN) ->Threads(THREADS); benchmark::RegisterBenchmark("InsertValue[String, String]", BM_InsertValue, &ss_map, ss_elems) ->RangeMultiplier(MULTIPLIER) ->Range(1, MAX_ELEMENTS) ->Complexity(benchmark::oN) ->Threads(THREADS); // Contains Benchmark Tests benchmark::RegisterBenchmark("ContainsValue[String, Int]", BM_ContainsValue, &si_map, si_elems) ->RangeMultiplier(MULTIPLIER) ->Range(1, MAX_ELEMENTS) ->Complexity(benchmark::oN) ->Threads(THREADS); benchmark::RegisterBenchmark("ContainsValue[String, String]", BM_ContainsValue, &ss_map, ss_elems) ->RangeMultiplier(MULTIPLIER) ->Range(1, MAX_ELEMENTS) ->Complexity(benchmark::oN) ->Threads(THREADS); benchmark::RunSpecifiedBenchmarks(); return 0; }