|
@ -0,0 +1,48 @@ |
|
|
|
|
|
#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, 8000>(); |
|
|
|
|
|
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; |
|
|
|
|
|
} |
|
|
|
|
|
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 06 took " << std::chrono::duration_cast<std::chrono::milliseconds>(time).count() << "ms" << std::endl; |
|
|
|
|
|
std::cout << "Per 1R1W ("<< thread_cnt << " threads) " << std::chrono::duration_cast<std::chrono::nanoseconds>(time).count()/250000 << "ns" << std::endl; |
|
|
|
|
|
|
|
|
|
|
|
return ret; |
|
|
|
|
|
} |