Skip to content

Commit 358c8c8

Browse files
committed
Update test to make it suitable for basic benchmarking and handle rand collisions
1 parent 9601de4 commit 358c8c8

File tree

1 file changed

+96
-89
lines changed

1 file changed

+96
-89
lines changed

src/native/containers/dn-simdhash-test.c

+96-89
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ typedef struct {
1717

1818
static inline uint8_t
1919
key_comparer (instance_data_t data, size_t lhs, size_t rhs) {
20-
return ((data.f == 4.20f) || (lhs == rhs));
20+
return ((data.f == 4.20f) || (lhs == rhs));
2121
}
2222

2323
#define DN_SIMDHASH_T dn_simdhash_size_t_size_t
@@ -67,7 +67,7 @@ void foreach_callback (size_t key, size_t value, void * user_data) {
6767
}
6868

6969
int main () {
70-
const int c = 10240;
70+
const int c = 320000;
7171
dn_simdhash_size_t_size_t_t *test = dn_simdhash_size_t_size_t_new(0, NULL);
7272
dn_simdhash_instance_data(instance_data_t, test).f = 3.14f;
7373
dn_simdhash_instance_data(instance_data_t, test).i = 42;
@@ -78,99 +78,106 @@ int main () {
7878
srand(1);
7979

8080
for (int i = 0; i < c; i++) {
81-
DN_SIMDHASH_KEY_T key = rand();
82-
dn_vector_push_back(keys, key);
8381
DN_SIMDHASH_VALUE_T value = (i * 2) + 1;
84-
dn_vector_push_back(values, value);
85-
86-
uint8_t ok = dn_simdhash_size_t_size_t_try_add(test, key, value);
87-
tassert(ok, "Insert failed");
88-
}
89-
90-
if (!tasserteq(dn_simdhash_count(test), c, "count did not match"))
91-
return 1;
92-
93-
printf("Calling foreach:\n");
94-
uint32_t foreach_count = 0;
95-
dn_simdhash_size_t_size_t_foreach(test, foreach_callback, &foreach_count);
96-
printf("Foreach iterated %u time(s)\n", foreach_count);
97-
printf("Count: %u, Capacity: %u, Cascaded item count: %u\n", dn_simdhash_count(test), dn_simdhash_capacity(test), count_cascaded_buckets(test));
98-
99-
for (int i = 0; i < c; i++) {
100-
DN_SIMDHASH_KEY_T key = *dn_vector_index_t(keys, DN_SIMDHASH_KEY_T, i);
101-
DN_SIMDHASH_VALUE_T value, expected_value = *dn_vector_index_t(values, DN_SIMDHASH_VALUE_T, i);
102-
103-
uint8_t ok = dn_simdhash_size_t_size_t_try_get_value(test, key, &value);
104-
if (tassert1(ok, key, "did not find key"))
105-
tasserteq(value, expected_value, "value did not match");
106-
}
107-
108-
// NOTE: Adding duplicates could grow the table if we're unlucky, since the add operation
109-
// eagerly grows before doing a table scan if we're at the grow threshold.
110-
for (int i = 0; i < c; i++) {
111-
DN_SIMDHASH_KEY_T key = *dn_vector_index_t(keys, DN_SIMDHASH_KEY_T, i);
112-
DN_SIMDHASH_VALUE_T value = *dn_vector_index_t(values, DN_SIMDHASH_VALUE_T, i);
82+
DN_SIMDHASH_KEY_T key;
11383

84+
retry: {
85+
key = rand();
11486
uint8_t ok = dn_simdhash_size_t_size_t_try_add(test, key, value);
115-
tassert1(!ok, key, "added duplicate key successfully");
116-
}
117-
118-
printf("After adding dupes: Count: %u, Capacity: %u, Cascaded item count: %u\n", dn_simdhash_count(test), dn_simdhash_capacity(test), count_cascaded_buckets(test));
119-
uint32_t final_capacity = dn_simdhash_capacity(test);
120-
121-
for (int i = 0; i < c; i++) {
122-
DN_SIMDHASH_KEY_T key = *dn_vector_index_t(keys, DN_SIMDHASH_KEY_T, i);
123-
uint8_t ok = dn_simdhash_size_t_size_t_try_remove(test, key);
124-
tassert1(ok, key, "could not remove key");
125-
126-
DN_SIMDHASH_VALUE_T value;
127-
ok = dn_simdhash_size_t_size_t_try_get_value(test, key, &value);
128-
tassert1(!ok, key, "found key after removal");
129-
}
130-
131-
if (!tasserteq(dn_simdhash_count(test), 0, "was not empty"))
132-
return 1;
133-
if (!tasserteq(dn_simdhash_capacity(test), final_capacity, "capacity changed by emptying"))
134-
return 1;
135-
136-
printf ("Calling foreach after emptying:\n");
137-
foreach_count = 0;
138-
dn_simdhash_size_t_size_t_foreach(test, foreach_callback, &foreach_count);
139-
printf("Foreach iterated %u time(s)\n", foreach_count);
140-
printf("Count: %u, Capacity: %u, Cascaded item count: %u\n", dn_simdhash_count(test), dn_simdhash_capacity(test), count_cascaded_buckets(test));
141-
142-
for (int i = 0; i < c; i++) {
143-
DN_SIMDHASH_KEY_T key = *dn_vector_index_t(keys, DN_SIMDHASH_KEY_T, i);
144-
DN_SIMDHASH_VALUE_T value;
145-
uint8_t ok = dn_simdhash_size_t_size_t_try_get_value(test, key, &value);
146-
tassert1(!ok, key, "found key after removal");
147-
}
148-
149-
for (int i = 0; i < c; i++) {
150-
DN_SIMDHASH_KEY_T key = *dn_vector_index_t(keys, DN_SIMDHASH_KEY_T, i);
151-
DN_SIMDHASH_VALUE_T value = *dn_vector_index_t(values, DN_SIMDHASH_VALUE_T, i);
152-
153-
uint8_t ok = dn_simdhash_size_t_size_t_try_add(test, key, value);
154-
tassert1(ok, key, "could not re-insert key after emptying");
155-
}
156-
157-
if (!tasserteq(dn_simdhash_capacity(test), final_capacity, "expected capacity not to change after refilling"))
158-
return 1;
159-
160-
for (int i = 0; i < c; i++) {
161-
DN_SIMDHASH_KEY_T key = *dn_vector_index_t(keys, DN_SIMDHASH_KEY_T, i);
162-
DN_SIMDHASH_VALUE_T value, expected_value = *dn_vector_index_t(values, DN_SIMDHASH_VALUE_T, i);
87+
if (!ok)
88+
goto retry;
89+
}
16390

164-
uint8_t ok = dn_simdhash_size_t_size_t_try_get_value(test, key, &value);
165-
if (tassert1(ok, key, "did not find key after refilling"))
166-
tasserteq(value, expected_value, "value did not match after refilling");
91+
dn_vector_push_back(keys, key);
92+
dn_vector_push_back(values, value);
16793
}
16894

169-
printf("Calling foreach after refilling:\n");
170-
foreach_count = 0;
171-
dn_simdhash_size_t_size_t_foreach(test, foreach_callback, &foreach_count);
172-
printf("Foreach iterated %u time(s)\n", foreach_count);
173-
printf("Count: %u, Capacity: %u, Cascaded item count: %u\n", dn_simdhash_count(test), dn_simdhash_capacity(test), count_cascaded_buckets(test));
95+
for (int iter = 0; iter < 100; iter++) {
96+
if (!tasserteq(dn_simdhash_count(test), c, "count did not match"))
97+
return 1;
98+
99+
printf("Calling foreach:\n");
100+
uint32_t foreach_count = 0;
101+
dn_simdhash_size_t_size_t_foreach(test, foreach_callback, &foreach_count);
102+
printf("Foreach iterated %u time(s)\n", foreach_count);
103+
printf("Count: %u, Capacity: %u, Cascaded item count: %u\n", dn_simdhash_count(test), dn_simdhash_capacity(test), count_cascaded_buckets(test));
104+
105+
for (int i = 0; i < c; i++) {
106+
DN_SIMDHASH_KEY_T key = *dn_vector_index_t(keys, DN_SIMDHASH_KEY_T, i);
107+
DN_SIMDHASH_VALUE_T value, expected_value = *dn_vector_index_t(values, DN_SIMDHASH_VALUE_T, i);
108+
109+
uint8_t ok = dn_simdhash_size_t_size_t_try_get_value(test, key, &value);
110+
if (tassert1(ok, key, "did not find key"))
111+
tasserteq(value, expected_value, "value did not match");
112+
}
113+
114+
// NOTE: Adding duplicates could grow the table if we're unlucky, since the add operation
115+
// eagerly grows before doing a table scan if we're at the grow threshold.
116+
for (int i = 0; i < c; i++) {
117+
DN_SIMDHASH_KEY_T key = *dn_vector_index_t(keys, DN_SIMDHASH_KEY_T, i);
118+
DN_SIMDHASH_VALUE_T value = *dn_vector_index_t(values, DN_SIMDHASH_VALUE_T, i);
119+
120+
uint8_t ok = dn_simdhash_size_t_size_t_try_add(test, key, value);
121+
tassert1(!ok, key, "added duplicate key successfully");
122+
}
123+
124+
printf("After adding dupes: Count: %u, Capacity: %u, Cascaded item count: %u\n", dn_simdhash_count(test), dn_simdhash_capacity(test), count_cascaded_buckets(test));
125+
uint32_t final_capacity = dn_simdhash_capacity(test);
126+
127+
for (int i = 0; i < c; i++) {
128+
DN_SIMDHASH_KEY_T key = *dn_vector_index_t(keys, DN_SIMDHASH_KEY_T, i);
129+
uint8_t ok = dn_simdhash_size_t_size_t_try_remove(test, key);
130+
tassert1(ok, key, "could not remove key");
131+
132+
DN_SIMDHASH_VALUE_T value;
133+
ok = dn_simdhash_size_t_size_t_try_get_value(test, key, &value);
134+
tassert1(!ok, key, "found key after removal");
135+
}
136+
137+
if (!tasserteq(dn_simdhash_count(test), 0, "was not empty"))
138+
return 1;
139+
if (!tasserteq(dn_simdhash_capacity(test), final_capacity, "capacity changed by emptying"))
140+
return 1;
141+
142+
printf ("Calling foreach after emptying:\n");
143+
foreach_count = 0;
144+
dn_simdhash_size_t_size_t_foreach(test, foreach_callback, &foreach_count);
145+
printf("Foreach iterated %u time(s)\n", foreach_count);
146+
printf("Count: %u, Capacity: %u, Cascaded item count: %u\n", dn_simdhash_count(test), dn_simdhash_capacity(test), count_cascaded_buckets(test));
147+
148+
for (int i = 0; i < c; i++) {
149+
DN_SIMDHASH_KEY_T key = *dn_vector_index_t(keys, DN_SIMDHASH_KEY_T, i);
150+
DN_SIMDHASH_VALUE_T value;
151+
uint8_t ok = dn_simdhash_size_t_size_t_try_get_value(test, key, &value);
152+
tassert1(!ok, key, "found key after removal");
153+
}
154+
155+
for (int i = 0; i < c; i++) {
156+
DN_SIMDHASH_KEY_T key = *dn_vector_index_t(keys, DN_SIMDHASH_KEY_T, i);
157+
DN_SIMDHASH_VALUE_T value = *dn_vector_index_t(values, DN_SIMDHASH_VALUE_T, i);
158+
159+
uint8_t ok = dn_simdhash_size_t_size_t_try_add(test, key, value);
160+
tassert1(ok, key, "could not re-insert key after emptying");
161+
}
162+
163+
if (!tasserteq(dn_simdhash_capacity(test), final_capacity, "expected capacity not to change after refilling"))
164+
return 1;
165+
166+
for (int i = 0; i < c; i++) {
167+
DN_SIMDHASH_KEY_T key = *dn_vector_index_t(keys, DN_SIMDHASH_KEY_T, i);
168+
DN_SIMDHASH_VALUE_T value, expected_value = *dn_vector_index_t(values, DN_SIMDHASH_VALUE_T, i);
169+
170+
uint8_t ok = dn_simdhash_size_t_size_t_try_get_value(test, key, &value);
171+
if (tassert1(ok, key, "did not find key after refilling"))
172+
tasserteq(value, expected_value, "value did not match after refilling");
173+
}
174+
175+
printf("Calling foreach after refilling:\n");
176+
foreach_count = 0;
177+
dn_simdhash_size_t_size_t_foreach(test, foreach_callback, &foreach_count);
178+
printf("Foreach iterated %u time(s)\n", foreach_count);
179+
printf("Count: %u, Capacity: %u, Cascaded item count: %u\n", dn_simdhash_count(test), dn_simdhash_capacity(test), count_cascaded_buckets(test));
180+
}
174181

175182
printf("done\n");
176183

0 commit comments

Comments
 (0)