#include "rbench.h" #include "rprint.h" #include "rtree.h" #include "rhashtable.h" #include "rkeytable.h" #include "rtest.h" #include "hashmap.h" #include #include #include using namespace std; long long hashit(const char **key) { long long hash = 0; const char *k = *key; for (; *k; k++) { hash += *k * 31 + 5; } return hash; } long long hashit2(const char **s) { unsigned hashval; const char *key = *s; for (hashval = 0; *key != '\0'; key++) hashval = *key + 31 * hashval; return hashval % HASHSIZE; } bool keycmp(const char **key1, const char **key2) { return !strcmp(*key1, *key2); } HashMap(HashMap_name, char *, char *, long long, hashit, keycmp) void hashmap_print(const HashMap_name *map) { printf("Hash Map:\n"); printf("\tBuckets: ["); for (size_t i = 0; i < map->cap; i++) { if (i != 0) printf(","); printf(" %ld", map->buckets[i]); } printf(" ]\n"); printf("\tEntries: ["); for (size_t i = 0; i < map->cap; i++) { HashMap_name_entry_t *entry = map->entries + i; if (i != 0) printf(", "); printf("{\n"); printf("\t\tIndex: %zd,\n", i); printf("\t\tKey: \"%s\",\n", entry->key); printf("\t\tHash: %lld,\n", entry->key_hash); printf("\t\tNext: %ld,\n", entry->next); printf("\t\tVal: %s,\n", entry->val); printf("\t}"); } printf("]\n"); printf("\tNext Empty: %zd\n", map->next_empty); printf("\tSize: %zd\n", map->size); printf("\tCapacity: %zd\n", map->cap); } void rbench_table_yuriimap() { HashMap_name *map = (HashMap_name *)rbf->data; if (rbf->first) { _r_generate_key_current = 0; HashMap_name *new_map = HashMap_name_new(); HashMap_name_init(new_map, 0); rbf->data = (void *)new_map; map = new_map; } char *key = strdup(rgenerate_key()); DS_codes_t code = HashMap_name_put(map, (const char **)&key, (const char **)&key); const char *res = *HashMap_name_get(map, (const char **)&key); rasserts(!strcmp(res, key)); if (rbf->last) { HashMap_name_destroy(map); } } void rbench_table_cppmap() { std::map *map = (std::map *)rbf->data; if (rbf->first) { _r_generate_key_current = 0; std::map *f = new std::map; map = f; rbf->data = (void *)f; } for (int i = 0; i < 1; i++) { char *key = strdup(rgenerate_key()); (*map)[key] = key; rasserts(!strcmp((*map)[key], key)); } if (rbf->last) { delete map; } } void rbench_table_rtree() { rtree_t *tree = (rtree_t *)rbf->data; if (rbf->first) { _r_generate_key_current = 0; tree = rtree_new(); rbf->data = (void *)tree; } for (int i = 0; i < 1; i++) { char *key = rgenerate_key(); rtree_set(tree, key, key); rasserts(!strcmp((char *)rtree_get(tree, key), key)); } if (rbf->last) rtree_free((rtree_t *)rbf->data); } void rbench_table_rhashtable() { if (rbf->first) _r_generate_key_current = 0; for (int i = 0; i < 1; i++) { char *key = rgenerate_key(); rset(key, key); rasserts(!strcmp(rget(key), key)); } } void rbench_table_rkeytable() { if (rbf->first) _r_generate_key_current = 0; for (int i = 0; i < 1; i++) { char *key = rgenerate_key(); rkset(key, key); rasserts(!strcmp(rkget(key), key)); } } nsecs_t total_execution_time = 0; long total_times = 0; bool show_progress = 1; void bench_fast_yurrii() { HashMap_name *map = HashMap_name_new(); HashMap_name_init(map, 0); char *key = NULL; BENCHP(90000, { key = rgenerate_key(); DS_codes_t code = HashMap_name_put(map, (const char **)&key, (const char **)&key); const char *res = *HashMap_name_get(map, (const char **)&key); rasserts(!strcmp(res, key)); }); HashMap_name_destroy(map); } void bench_fast_retoor() { rtree_t *tree = rtree_new(); char *key = NULL; BENCHP(90000, { key = rgenerate_key(); rtree_set(tree, key, key); rasserts(!strcmp((char *)rtree_get(tree, key), key)); }); rtree_free(tree); } void bench_table(long times) { bench_fast_retoor(); bench_fast_yurrii(); rbench_t *r; rprint("\\T B\\l Times: %ld\n", times); r = rbench_new(); r->show_progress = show_progress; r->add_function(r, "hashmap", "yurii", rbench_table_yuriimap); r->add_function(r, "rtree", "retoor", rbench_table_rtree); r->add_function(r, "hashtable", "k&r", rbench_table_rhashtable); // r->add_function(r, "keytable", "k*r", rbench_table_rkeytable); r->add_function(r, "map", "cpp", rbench_table_cppmap); r->execute(r, times); total_execution_time += r->execution_time; total_times += times * 2; rbench_free(r); } typedef struct rtree2_t { struct rtree2_t *children[255]; struct rtree2_t *next[255]; void *value; char c; } rtree2_t; rtree2_t *rtree2_new() { rtree2_t *tree = (rtree2_t *)calloc(1, sizeof(rtree2_t)); return tree; } void rtree2_set(rtree2_t *tree, char *key, void *value) { if (tree->c == *key) { key++; if (!key) { tree->value = value; } } else { if (tree->children[*key]) { tree = tree->children[*key]; } else { printf("HIER EERS %cT\n", *key); tree = tree->children[*key] = rtree2_new(); tree->c = *key; } key++; if (!*key) { printf("HIEr LAatSt 5c\n", *key); tree->value = value; return; } rtree2_set(tree, key, value); } } void *rtree2_get(rtree2_t *tree, char *key) { while (*key) { tree = tree->children[*key]; key++; } return tree->value; } void bench_fast_retoor2() { rtree2_t *tree = rtree2_new(); char *key = NULL; BENCHP(90000, { key = rgenerate_key(); rtree2_set(tree, key, key); rasserts(!strcmp((char *)rtree2_get(tree, key), key)); }); // rtree_free(tree); } int main() { rtree2_t *tree = rtree2_new(); char name[] = "key"; rtree2_set(tree, name, (void *)strdup("lala")); char *val = (char *)rtree2_get(tree, name); printf("%s\n", val); bench_fast_retoor2(); exit(0); show_progress = true; long times = 90000; bench_table(times); return rtest_end(""); }