diff options
author | Lucas De Marchi <lucas.demarchi@intel.com> | 2013-08-13 11:00:49 -0300 |
---|---|---|
committer | Lucas De Marchi <lucas.demarchi@intel.com> | 2013-09-20 14:35:52 -0500 |
commit | 65fb2dc3f7cd1e3e18b9ee10703b71d628a54c9d (patch) | |
tree | 0d514fc2aba1e6c5f854d654b0d051fcc7fea0a8 | |
parent | 228750032d0d79881be47c5f8b7b463737931e35 (diff) | |
download | kmod-65fb2dc3f7cd1e3e18b9ee10703b71d628a54c9d.tar.gz |
Benchmark hash timing per key len
-rw-r--r-- | libkmod/libkmod-hash.c | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/libkmod/libkmod-hash.c b/libkmod/libkmod-hash.c index 06c7266..a299f06 100644 --- a/libkmod/libkmod-hash.c +++ b/libkmod/libkmod-hash.c @@ -283,6 +283,19 @@ static inline unsigned int hash_paul(const char *key, unsigned int len) return hash; } +static _always_inline_ unsigned int hashfunc(const char *key, unsigned int len) +{ + unsigned long t; + unsigned int ret; + t = get_cycles(0); + ret = MurmurHash3_x86_32(key, len); + t = get_cycles(t); + + printf("%u %lu\n", len, t); + + return ret; +} + /* * add or replace key in hash map. * @@ -292,7 +305,7 @@ static inline unsigned int hash_paul(const char *key, unsigned int len) int hash_add(struct hash *hash, const char *key, const void *value) { unsigned int keylen = strlen(key); - unsigned int hashval = hash_superfast(key, keylen); + unsigned int hashval = hashfunc(key, keylen); unsigned int pos = hashval & (hash->n_buckets - 1); struct hash_bucket *bucket = hash->buckets + pos; struct hash_entry *entry, *entry_end; @@ -329,7 +342,7 @@ int hash_add(struct hash *hash, const char *key, const void *value) hash->count++; return 0; } - +#if 0 void hash_dump(struct hash *hash) { unsigned int i _unused_; @@ -360,12 +373,16 @@ void hash_dump_keys(struct hash *hash) fprintf(stderr, "%s\n", entry->key); } } +#else +void hash_dump(struct hash *hash) { } +void hash_dump_keys(struct hash *hash) {} +#endif /* similar to hash_add(), but fails if key already exists */ int hash_add_unique(struct hash *hash, const char *key, const void *value) { unsigned int keylen = strlen(key); - unsigned int hashval = hash_superfast(key, keylen); + unsigned int hashval = hashfunc(key, keylen); unsigned int pos = hashval & (hash->n_buckets - 1); struct hash_bucket *bucket = hash->buckets + pos; struct hash_entry *entry, *entry_end; @@ -410,7 +427,7 @@ static int hash_entry_cmp(const void *pa, const void *pb) void *hash_find(const struct hash *hash, const char *key) { unsigned int keylen = strlen(key); - unsigned int hashval = hash_superfast(key, keylen); + unsigned int hashval = hashfunc(key, keylen); unsigned int pos = hashval & (hash->n_buckets - 1); const struct hash_bucket *bucket = hash->buckets + pos; const struct hash_entry se = { @@ -428,7 +445,7 @@ void *hash_find(const struct hash *hash, const char *key) int hash_del(struct hash *hash, const char *key) { unsigned int keylen = strlen(key); - unsigned int hashval = hash_superfast(key, keylen); + int hashval = hashfunc(key, keylen); unsigned int pos = hashval & (hash->n_buckets - 1); unsigned int steps_used, steps_total; struct hash_bucket *bucket = hash->buckets + pos; |