void test_sparse_estimate_cardinality() { uint b = 10; Hyperloglog *hll = mock_sparse_hll(b); sassert(3 == estimate_cardinality(hll)); update_sparse_list(hll, 54, 20); sassert(4 == estimate_cardinality(hll)); for (int i = 100; i < 150; i++) { update_sparse_list(hll, i, i % 20); } sassert(52 == estimate_cardinality(hll)); free(hll); }
void test_estimate_cardinality() { uint b = 10; Hyperloglog *hll = mock_hll(b); sassert(3 == estimate_cardinality(hll)); hll->M[54] = 20; sassert(4 == estimate_cardinality(hll)); for (int i = 100; i < 150; i++) { hll->M[i] = i % 20; } sassert(52 == estimate_cardinality(hll)); free(hll); }
void run_test(enum test_type t_type, uint8_t use_hashes) { uint64_t i; uint64_t is_member_count; uint64_t rnd_nbr; char *type; uint64_t set_bits; struct timeval tval_before, tval_after, tval_result; /* insertion */ create_filter(filter_size, use_hashes); gettimeofday(&tval_before, NULL); switch (t_type) { case EVEN_UNEVEN: type = "un/even"; for (i = 1; i < insert_size << 1; i += 2) { insert_key((char *)&i, 8); } break; case RANDOM: type = "random"; for (i = 0; i < insert_size; i++) { rnd_nbr = arc4random(); rnd_nbr = rnd_nbr << 32; rnd_nbr = rnd_nbr | arc4random(); insert_key((char *)&rnd_nbr, 8); } break; case COUNTING: type = "counting"; for (i = 0; i < insert_size; i++) { insert_key((char *)&i, 8); } break; default: /* not reached */ type = ""; break; } gettimeofday(&tval_after, NULL); timersub(&tval_after, &tval_before, &tval_result); /* testing */ is_member_count = 0; switch (t_type) { case EVEN_UNEVEN: for (i = 0; i < insert_size << 1; i += 2) { if (is_member((char *)&i, 8)) { is_member_count++; } } break; case RANDOM: for (i = 0; i < insert_size; i++) { rnd_nbr = arc4random(); rnd_nbr = rnd_nbr << 32; rnd_nbr = rnd_nbr | arc4random(); if (is_member((char *)&rnd_nbr, 8)) { is_member_count++; } } break; case COUNTING: for (i = insert_size; i < insert_size << 1; i++) { if (is_member((char *)&i, 8)) { is_member_count++; } } break; default: /* not reached */ break; } set_bits = estimate_cardinality(); /* print info */ printf("%-8s: ins time: %2ld.%-6ld false pos: %6.2f%% (%10lu) fill factor: %6.2f%% (%10lu) err rate: %6.2f%% (%10lu)\n", type, (long int)tval_result.tv_sec, (long int)tval_result.tv_usec, (double)is_member_count / (double)insert_size * 100.0, is_member_count, (double)set_bits / (double)filter_size * 100.0, set_bits, (double)(insert_size * K - set_bits) / (double)(insert_size * K) * 100.0, insert_size * K - set_bits); }