diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2018-11-29 13:35:18 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-11-29 13:35:18 +0100 |
commit | 1b378e87eaf64857ca914094a624952731f0c827 (patch) | |
tree | 29c83825671bc61437f01c7b0447410f55ec099c /vespalib | |
parent | d4f2c2794f3ec369067298c5471d74d68a3aaf30 (diff) | |
parent | 13b0ebdd56a3c875ed3a9abd0f3abd8d574db61c (diff) |
Merge pull request #7804 from vespa-engine/balder/randomize-keys
Balder/randomize keys
Diffstat (limited to 'vespalib')
-rw-r--r-- | vespalib/src/tests/stllike/lookup_benchmark.cpp | 50 |
1 files changed, 43 insertions, 7 deletions
diff --git a/vespalib/src/tests/stllike/lookup_benchmark.cpp b/vespalib/src/tests/stllike/lookup_benchmark.cpp index 1145a110fa2..4f65bebe560 100644 --- a/vespalib/src/tests/stllike/lookup_benchmark.cpp +++ b/vespalib/src/tests/stllike/lookup_benchmark.cpp @@ -1,13 +1,14 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -#include <stddef.h> -#include <stdlib.h> -#include <stdio.h> +#include <cstddef> +#include <cstdlib> +#include <cstdio> #include <map> #include <set> #include <tr1/unordered_set> #include <vector> #include <algorithm> #include <vespa/vespalib/stllike/hash_set.hpp> +#include <vespa/vespalib/stllike/hash_map.hpp> template <typename S> void fill(S & s, size_t count) @@ -17,9 +18,21 @@ void fill(S & s, size_t count) } } +template <typename M> +void fillM(M & m, size_t count) +{ + for(size_t i(0); i < count; i++) { + m[i] = i; + } +} + template <typename S> size_t lookup_bench(S & s, size_t count, size_t rep) { + std::vector<uint32_t> keys(count); + for (uint32_t & key : keys) { + key = rand()%count; + } size_t sum(0); typename S::const_iterator e(s.end()); for (size_t j(0); j < rep; j++) { @@ -39,6 +52,13 @@ size_t bench(S & set, size_t sz, size_t numLookups) return lookup_bench(set, sz, numLookups/sz); } +template <typename M> +size_t benchM(M & map, size_t sz, size_t numLookups) +{ + fillM(map, sz); + return lookup_bench(map, sz, numLookups/sz); +} + size_t benchMap(size_t sz, size_t numLookups) { std::set<uint32_t> set; @@ -53,16 +73,28 @@ size_t benchHashStl(size_t sz, size_t numLookups) size_t benchHashVespaLib(size_t sz, size_t numLookups) { - vespalib::hash_set<uint32_t> set; + vespalib::hash_set<uint32_t> set(3*sz); return bench(set, sz, numLookups); } size_t benchHashVespaLib2(size_t sz, size_t numLookups) { - vespalib::hash_set<uint32_t, vespalib::hash<uint32_t>, std::equal_to<uint32_t>, vespalib::hashtable_base::and_modulator > set; + vespalib::hash_set<uint32_t, vespalib::hash<uint32_t>, std::equal_to<uint32_t>, vespalib::hashtable_base::and_modulator > set(3*sz); return bench(set, sz, numLookups); } +size_t benchHashMapVespaLib(size_t sz, size_t numLookups) +{ + vespalib::hash_map<uint32_t, uint32_t> set(3*sz); + return benchM(set, sz, numLookups); +} + +size_t benchHashMapVespaLib2(size_t sz, size_t numLookups) +{ + vespalib::hash_map<uint32_t, uint32_t, vespalib::hash<uint32_t>, std::equal_to<uint32_t>, vespalib::hashtable_base::and_modulator > set(3*sz); + return benchM(set, sz, numLookups); +} + int main(int argc, char *argv[]) { size_t count(1000); @@ -72,22 +104,26 @@ int main(int argc, char *argv[]) type = argv[1][0]; } if (argc >= 3) { - count = strtoul(argv[2], NULL, 0); + count = strtoul(argv[2], nullptr, 0); } if (argc >= 4) { - rep = strtoul(argv[3], NULL, 0); + rep = strtoul(argv[3], nullptr, 0); } std::vector<const char *> description(256); description['m'] = "std::set"; description['h'] = "std::hash_set"; description['g'] = "vespalib::hash_set"; description['G'] = "vespalib::hash_set with simple and modulator."; + description['k'] = "vespalib::hash_map"; + description['K'] = "vespalib::hash_map with simple and modulator."; size_t found(0); switch (type) { case 'm': found = benchMap(count, rep); break; case 'h': found = benchHashStl(count, rep); break; case 'g': found = benchHashVespaLib(count, rep); break; case 'G': found = benchHashVespaLib2(count, rep); break; + case 'k': found = benchHashMapVespaLib(count, rep); break; + case 'K': found = benchHashMapVespaLib2(count, rep); break; default: printf("'m' = %s\n", description[type]); printf("'h' = %s\n", description[type]); |