#include "lfhmap.hpp"
|
|
#include <string>
|
|
#include <iostream>
|
|
#include <future>
|
|
#include <vector>
|
|
|
|
template<typename fn>
|
|
void repeat(size_t nb, fn v) {
|
|
while(nb--) {
|
|
v();
|
|
}
|
|
}
|
|
|
|
int main() {
|
|
constexpr size_t thread_cnt = 16;
|
|
size_t v = 0;
|
|
auto map = new mct20::lfhmap<size_t, std::string, 40000>();
|
|
std::vector<std::future<int>> finals;
|
|
auto start = std::chrono::high_resolution_clock::now();
|
|
repeat(thread_cnt, [&](){
|
|
size_t v2 = v;
|
|
v++;
|
|
finals.push_back(std::async(std::launch::async, [&map, v2](){
|
|
for(int a = v2; a < 250000; a+=thread_cnt) {
|
|
map->set(a, std::to_string(a));
|
|
}
|
|
for(int a = v2; a < 250000; a+=thread_cnt) {
|
|
if(auto acc = map->get(a); acc) {
|
|
const std::string& t = acc.value();
|
|
if(t != std::to_string(a))
|
|
return 1;
|
|
} else
|
|
return 1;
|
|
}
|
|
for(int a = v2; a < 250000; a+=thread_cnt) {
|
|
map->remove(a);
|
|
}
|
|
return 0;
|
|
}));
|
|
});
|
|
|
|
for(auto& a : finals) a.wait();
|
|
int ret = 0;
|
|
for(auto& a : finals) ret += a.get();
|
|
|
|
auto time = std::chrono::high_resolution_clock::now() - start;
|
|
std::cout << "Test 08 took " << std::chrono::duration_cast<std::chrono::milliseconds>(time).count() << "ms" << std::endl;
|
|
std::cout << "Per 1R1W1D ("<< thread_cnt << " threads) " << std::chrono::duration_cast<std::chrono::nanoseconds>(time).count()/250000 << "ns" << std::endl;
|
|
|
|
return ret;
|
|
}
|