diff options
Diffstat (limited to 'test/dict_bench.c')
-rw-r--r-- | test/dict_bench.c | 73 |
1 files changed, 65 insertions, 8 deletions
diff --git a/test/dict_bench.c b/test/dict_bench.c index a940ed2..923ec5d 100644 --- a/test/dict_bench.c +++ b/test/dict_bench.c @@ -24,9 +24,11 @@ #include <glib.h> +#include "zix/ampatree.h" #include "zix/chunk.h" #include "zix/hash.h" #include "zix/patree.h" +#include "zix/trie.h" const unsigned seed = 1; @@ -92,16 +94,18 @@ main(int argc, char** argv) FILE* insert_dat = fopen("dict_insert.txt", "w"); FILE* search_dat = fopen("dict_search.txt", "w"); - fprintf(insert_dat, "# n\tGHashTable\tZixHash\tZixPatree\n"); - fprintf(search_dat, "# n\tGHashTable\tZixHash\tZixPatree\n"); + fprintf(insert_dat, "# n\tGHashTable\tZixHash\tZixPatree\tZixTrie\tZixAMPatree\n"); + fprintf(search_dat, "# n\tGHashTable\tZixHash\tZixPatree\tZixTrie\tZixAMPatree\n"); for (size_t n = n_strings / 16; n <= n_strings; n *= 2) { printf("Benchmarking n = %zu\n", n); - ZixPatree* patree = zix_patree_new(); - GHashTable* hash = g_hash_table_new(g_str_hash, g_str_equal); - ZixHash* zhash = zix_hash_new((ZixHashFunc)zix_chunk_hash, - (ZixEqualFunc)zix_chunk_equal, - sizeof(ZixChunk)); + ZixPatree* patree = zix_patree_new(); + ZixAMPatree* ampatree = zix_ampatree_new(); + ZixTrie* trie = zix_trie_new(); + GHashTable* hash = g_hash_table_new(g_str_hash, g_str_equal); + ZixHash* zhash = zix_hash_new((ZixHashFunc)zix_chunk_hash, + (ZixEqualFunc)zix_chunk_equal, + sizeof(ZixChunk)); fprintf(insert_dat, "%zu", n); fprintf(search_dat, "%zu", n); @@ -133,6 +137,26 @@ main(int argc, char** argv) return test_fail("Failed to insert `%s'\n", strings[i]); } } + fprintf(insert_dat, "\t%lf", bench_end(&insert_start)); + + // ZixTrie + insert_start = bench_start(); + for (size_t i = 0; i < n; ++i) { + ZixStatus st = zix_trie_insert(trie, strings[i], lengths[i]); + if (st && st != ZIX_STATUS_EXISTS) { + return test_fail("Failed to insert `%s'\n", strings[i]); + } + } + fprintf(insert_dat, "\t%lf", bench_end(&insert_start)); + + // ZixAMPatree + insert_start = bench_start(); + for (size_t i = 0; i < n; ++i) { + ZixStatus st = zix_ampatree_insert(ampatree, strings[i], lengths[i]); + if (st && st != ZIX_STATUS_EXISTS) { + return test_fail("Failed to insert `%s'\n", strings[i]); + } + } fprintf(insert_dat, "\t%lf\n", bench_end(&insert_start)); // Benchmark search @@ -176,13 +200,46 @@ main(int argc, char** argv) return test_fail("Patree: Failed to find `%s'\n", strings[index]); } if (strcmp(match, strings[index])) { - return test_fail("Patree: Bad match for `%s'\n", strings[index]); } } + fprintf(search_dat, "\t%lf", bench_end(&search_start)); + + // ZixTrie + srand(seed); + search_start = bench_start(); + for (size_t i = 0; i < n; ++i) { + const size_t index = rand() % n; + const char* match = NULL; + if (zix_trie_find(trie, strings[index], &match)) { + return test_fail("Trie: Failed to find `%s'\n", strings[index]); + } + if (strcmp(match, strings[index])) { + return test_fail("Trie: Bad match `%s' for `%s'\n", + match, strings[index]); + } + } + fprintf(search_dat, "\t%lf", bench_end(&search_start)); + + // ZixAMPatree + srand(seed); + search_start = bench_start(); + for (size_t i = 0; i < n; ++i) { + const size_t index = rand() % n; + const char* match = NULL; + if (zix_ampatree_find(ampatree, strings[index], &match)) { + return test_fail("AMPatree: Failed to find `%s'\n", strings[index]); + } + if (strcmp(match, strings[index])) { + return test_fail("AMPatree: Bad match `%s' for `%s'\n", + match, strings[index]); + } + } fprintf(search_dat, "\t%lf\n", bench_end(&search_start)); zix_patree_free(patree); + zix_ampatree_free(ampatree); + zix_trie_free(trie); zix_hash_free(zhash); g_hash_table_unref(hash); } |