From 91a59e03a8be94cc8176637ccee4b0c92e6d5f58 Mon Sep 17 00:00:00 2001 From: antirez Date: Wed, 7 Sep 2016 10:32:57 +0200 Subject: [PATCH] dict.c benchmark. --- src/Makefile | 5 ++++- src/dict.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/src/Makefile b/src/Makefile index 325402ec..6bd8d8d6 100644 --- a/src/Makefile +++ b/src/Makefile @@ -203,6 +203,9 @@ $(REDIS_BENCHMARK_NAME): $(REDIS_BENCHMARK_OBJ) $(REDIS_CHECK_AOF_NAME): $(REDIS_CHECK_AOF_OBJ) $(REDIS_LD) -o $@ $^ $(FINAL_LIBS) +dict-benchmark: dict.c zmalloc.c sds.c + $(REDIS_CC) $(FINAL_CFLAGS) dict.c zmalloc.c sds.c -D DICT_BENCHMARK_MAIN -o dict-benchmark + # Because the jemalloc.h header is generated as a part of the jemalloc build, # building it should complete before building any other object. Instead of # depending on a single artifact, build all dependencies first. @@ -210,7 +213,7 @@ $(REDIS_CHECK_AOF_NAME): $(REDIS_CHECK_AOF_OBJ) $(REDIS_CC) -c $< clean: - rm -rf $(REDIS_SERVER_NAME) $(REDIS_SENTINEL_NAME) $(REDIS_CLI_NAME) $(REDIS_BENCHMARK_NAME) $(REDIS_CHECK_RDB_NAME) $(REDIS_CHECK_AOF_NAME) *.o *.gcda *.gcno *.gcov redis.info lcov-html Makefile.dep + rm -rf $(REDIS_SERVER_NAME) $(REDIS_SENTINEL_NAME) $(REDIS_CLI_NAME) $(REDIS_BENCHMARK_NAME) $(REDIS_CHECK_RDB_NAME) $(REDIS_CHECK_AOF_NAME) *.o *.gcda *.gcno *.gcov redis.info lcov-html Makefile.dep dict-benchmark .PHONY: clean diff --git a/src/dict.c b/src/dict.c index 887a0f65..39432956 100644 --- a/src/dict.c +++ b/src/dict.c @@ -45,7 +45,11 @@ #include "dict.h" #include "zmalloc.h" +#ifndef DICT_BENCHMARK_MAIN #include "redisassert.h" +#else +#include +#endif /* Using dictEnableResize() / dictDisableResize() we make possible to * enable/disable resizing of the hash table as needed. This is very important @@ -1083,3 +1087,55 @@ void dictGetStats(char *buf, size_t bufsize, dict *d) { /* Make sure there is a NULL term at the end. */ if (orig_bufsize) orig_buf[orig_bufsize-1] = '\0'; } + +/* ------------------------------- Benchmark ---------------------------------*/ + +#ifdef DICT_BENCHMARK_MAIN + +#include "sds.h" + +unsigned int hashCallback(const void *key) { + return dictGenHashFunction((unsigned char*)key, sdslen((char*)key)); +} + +int compareCallback(void *privdata, const void *key1, const void *key2) { + int l1,l2; + DICT_NOTUSED(privdata); + + l1 = sdslen((sds)key1); + l2 = sdslen((sds)key2); + if (l1 != l2) return 0; + return memcmp(key1, key2, l1) == 0; +} + +void freeCallback(void *privdata, void *val) { + DICT_NOTUSED(privdata); + + sdsfree(val); +} + +dictType BenchmarkDictType = { + hashCallback, + NULL, + NULL, + compareCallback, + freeCallback, + NULL +}; + +int main(void) { + long j; + long hits = 0, misses = 0; + long long start, elapsed; + dict *dict = dictCreate(&BenchmarkDictType,NULL); + + start = timeInMilliseconds(); + for (j = 0; j < 5000000; j++) { + int retval = dictAdd(dict,sdsfromlonglong(j),(void*)j); + assert(retval == DICT_OK); + } + elapsed = timeInMilliseconds()-start; + printf("Inserting 5M items: %lld ms\n", elapsed); + assert(dictSize(dict) == 5000000); +} +#endif