summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLucas De Marchi <lucas.demarchi@intel.com>2013-08-13 11:00:49 -0300
committerLucas De Marchi <lucas.demarchi@intel.com>2013-09-20 14:35:52 -0500
commit65fb2dc3f7cd1e3e18b9ee10703b71d628a54c9d (patch)
tree0d514fc2aba1e6c5f854d654b0d051fcc7fea0a8
parent228750032d0d79881be47c5f8b7b463737931e35 (diff)
downloadkmod-65fb2dc3f7cd1e3e18b9ee10703b71d628a54c9d.tar.gz
Benchmark hash timing per key len
-rw-r--r--libkmod/libkmod-hash.c27
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;