#pragma once #include #include #include #include #include #include #include #include DEFINE_int32(num_threads, 8, "Number of concurrent threads"); DEFINE_int32(duration, 10, "Duration of test (in seconds)"); struct Stats { uint64_t total{0}; uint64_t succ[4] = {0, 0, 0, 0}; }; const int OP_INSERT = 0; const int OP_CONTAINS = 1; const int OP_REMOVE = 2; const int OP_FIND = 3; inline void RunConcurrentTest( std::function *, Stats *)> test_func) { std::atomic run{true}; std::unique_ptr stats(new Stats[FLAGS_num_threads]); std::vector threads; for (int i = 0; i < FLAGS_num_threads; ++i) { threads.push_back(std::thread(test_func, &run, &stats.get()[i])); } std::this_thread::sleep_for(std::chrono::seconds(FLAGS_duration)); run.store(false, std::memory_order_relaxed); for (int i = 0; i < FLAGS_num_threads; ++i) { Stats *tstats = &stats.get()[i]; threads[i].join(); std::cout << "Thread " << i << " stats:" << std::endl; std::cout << " Operations: " << tstats->total << std::endl; std::cout << " Successful insert: " << tstats->succ[0] << std::endl; std::cout << " Successful contains: " << tstats->succ[1] << std::endl; std::cout << " Successful remove: " << tstats->succ[2] << std::endl; std::cout << " Successful find: " << tstats->succ[3] << std::endl; } std::cout << std::endl; uint64_t agg[4] = {0, 0, 0, 0}; for (int i = 0; i < 4; ++i) { for (int j = 0; j < FLAGS_num_threads; ++j) { agg[i] += stats.get()[j].succ[i]; } } std::cout << "Successful insert: " << agg[0] << " (" << agg[0] / FLAGS_duration << " calls/s)" << std::endl; std::cout << "Successful contains: " << agg[1] << " (" << agg[1] / FLAGS_duration << " calls/s)" << std::endl; std::cout << "Successful remove: " << agg[2] << " (" << agg[2] / FLAGS_duration << " calls/s)" << std::endl; std::cout << "Successful find: " << agg[3] << " (" << agg[3] / FLAGS_duration << " calls/s)" << std::endl; std::cout << std::endl; uint64_t tot = 0, tops = 0; for (int i = 0; i < 4; ++i) { tot += agg[i]; } for (int i = 0; i < FLAGS_num_threads; ++i) { tops += stats.get()[i].total; } std::cout << "Total successful: " << tot << " (" << tot / FLAGS_duration << " calls/s)" << std::endl; std::cout << "Total ops: " << tops << " (" << tops / FLAGS_duration << " calls/s)" << std::endl; }