194 std::vector<uint256> hashes;
196 set.setup_bytes(bytes);
197 uint32_t n_insert =
static_cast<uint32_t
>(load * (bytes /
sizeof(
uint256)));
198 hashes.resize(n_insert);
199 for (uint32_t i = 0; i < n_insert; ++i) {
200 uint32_t* ptr = (uint32_t*)hashes[i].begin();
201 for (uint8_t j = 0; j < 8; ++j)
208 std::vector<uint256> hashes_insert_copy = hashes;
209 std::shared_mutex mtx;
213 std::unique_lock<std::shared_mutex> l(mtx);
215 for (uint32_t i = 0; i < (n_insert / 2); ++i)
216 set.insert(hashes_insert_copy[i]);
221 std::vector<std::thread> threads;
224 for (uint32_t x = 0; x < 3; ++x)
227 threads.emplace_back([&, x] {
228 std::shared_lock<std::shared_mutex> l(mtx);
229 size_t ntodo = (n_insert/4)/3;
230 size_t start = ntodo*x;
231 size_t end = ntodo*(x+1);
232 for (uint32_t i = start; i < end; ++i) {
233 bool contains = set.contains(hashes[i], true);
240 for (std::thread& t : threads)
243 std::unique_lock<std::shared_mutex> l(mtx);
245 for (uint32_t i = (n_insert / 2); i < n_insert; ++i)
246 set.insert(hashes_insert_copy[i]);
249 size_t count_erased_but_contained = 0;
251 size_t count_stale = 0;
253 size_t count_fresh = 0;
255 for (uint32_t i = 0; i < (n_insert / 4); ++i)
256 count_erased_but_contained += set.contains(hashes[i],
false);
257 for (uint32_t i = (n_insert / 4); i < (n_insert / 2); ++i)
258 count_stale += set.contains(hashes[i],
false);
259 for (uint32_t i = (n_insert / 2); i < n_insert; ++i)
260 count_fresh += set.contains(hashes[i],
false);
262 double hit_rate_erased_but_contained = double(count_erased_but_contained) / (double(n_insert) / 4.0);
263 double hit_rate_stale = double(count_stale) / (double(n_insert) / 4.0);
264 double hit_rate_fresh = double(count_fresh) / (double(n_insert) / 2.0);
270 BOOST_CHECK(hit_rate_stale > 2 * hit_rate_erased_but_contained);