summaryrefslogtreecommitdiffhomepage
path: root/misc/benchmarks
diff options
context:
space:
mode:
authorTyge Løvset <[email protected]>2023-04-23 20:02:29 +0200
committerTyge Løvset <[email protected]>2023-04-23 20:02:29 +0200
commitee619c6ef061c4adb2b13985ebb7d2c67551c84a (patch)
treecfd0b41788cbdb2e4788b625b15024ac6e0c6576 /misc/benchmarks
parente78f0ed961c3d0f34b63e113247194fc9eafa636 (diff)
downloadSTC-modified-ee619c6ef061c4adb2b13985ebb7d2c67551c84a.tar.gz
STC-modified-ee619c6ef061c4adb2b13985ebb7d2c67551c84a.zip
Tuned cmap.h and hash function.
Diffstat (limited to 'misc/benchmarks')
-rw-r--r--misc/benchmarks/shootout_hashmaps.cpp1
-rw-r--r--misc/benchmarks/various/sso_bench.cpp67
2 files changed, 40 insertions, 28 deletions
diff --git a/misc/benchmarks/shootout_hashmaps.cpp b/misc/benchmarks/shootout_hashmaps.cpp
index 8eb36b34..54680402 100644
--- a/misc/benchmarks/shootout_hashmaps.cpp
+++ b/misc/benchmarks/shootout_hashmaps.cpp
@@ -35,7 +35,6 @@ KHASH_MAP_INIT_INT64(ii, IValue)
// cmap template expansion
#define i_key IKey
#define i_val IValue
-//#define i_sizebits 64 // more than 2.2 billion elements?
#define i_tag ii
#define i_max_load_factor MAX_LOAD_FACTOR / 100.0f
#include <stc/cmap.h>
diff --git a/misc/benchmarks/various/sso_bench.cpp b/misc/benchmarks/various/sso_bench.cpp
index 9841c296..71d123e8 100644
--- a/misc/benchmarks/various/sso_bench.cpp
+++ b/misc/benchmarks/various/sso_bench.cpp
@@ -9,19 +9,32 @@
#define i_val_str
#include <stc/cstack.h>
-#define i_type StcSet
-#define i_expandby 2
-#define i_val_str
-#include <stc/cset.h>
-
#include <vector>
using StdVec = std::vector<std::string>;
-//#include "../external/ankerl/robin_hood.h"
-//using StdSet = robin_hood::unordered_flat_set<std::string>;
#include <unordered_set>
-using StdSet = std::unordered_set<std::string>;
+#include "../external/ankerl/robin_hood.h"
+
+struct string_hash {
+ using is_transparent = void;
+ [[nodiscard]] size_t operator()(const char *txt) const {
+ return std::hash<std::string_view>{}(txt);
+ }
+ [[nodiscard]] size_t operator()(std::string_view txt) const {
+ return std::hash<std::string_view>{}(txt);
+ }
+ [[nodiscard]] size_t operator()(const std::string &txt) const {
+ return std::hash<std::string>{}(txt);
+ }
+};
+using StdSet = robin_hood::unordered_flat_set<std::string, string_hash, std::equal_to<>>;
+//using StdSet = std::unordered_set<std::string>;
+
+#define i_type StcSet
+#define i_val_str
+//#define i_hash(txtp) std::hash<std::string_view>{}(*txtp)
+#include <stc/cset.h>
static const int BENCHMARK_SIZE = 250000;
@@ -43,28 +56,28 @@ static inline const char* randomString(int strsize) {
-static inline void addRandomString(StdVec& vec, int strsize) {
- vec.push_back(randomString(strsize));
+static inline void addRandomString(StdVec& vec, const char* str) {
+ vec.push_back(str);
}
-static inline void addRandomString(StcVec& vec, int strsize) {
- StcVec_emplace(&vec, randomString(strsize));
+static inline void addRandomString(StcVec& vec, const char* str) {
+ StcVec_emplace(&vec, str);
}
-static inline void addRandomString(StdSet& set, int strsize) {
- set.insert(randomString(strsize));
+static inline void addRandomString(StdSet& set, const char* str) {
+ set.insert(str);
}
-static inline void addRandomString(StcSet& set, int strsize) {
- StcSet_emplace(&set, randomString(strsize));
+static inline void addRandomString(StcSet& set, const char* str) {
+ StcSet_emplace(&set, str);
}
-static inline bool getRandomString(const StdSet& set, int strsize) {
- return set.find(randomString(strsize)) != set.end();
+static inline bool getRandomString(const StdSet& set, const char* str) {
+ return set.find(str) != set.end();
}
-static inline bool getRandomString(const StcSet& set, int strsize) {
- return StcSet_contains(&set, randomString(strsize));
+static inline bool getRandomString(const StcSet& set, const char* str) {
+ return StcSet_contains(&set, str);
}
@@ -73,7 +86,7 @@ int benchmark(C& container, const int n, const int strsize) {
time_point t1 = std::chrono::high_resolution_clock::now();
for (int i = 0; i < n; i++)
- addRandomString(container, strsize);
+ addRandomString(container, randomString(strsize));
time_point t2 = std::chrono::high_resolution_clock::now();
const auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count();
@@ -84,12 +97,12 @@ int benchmark(C& container, const int n, const int strsize) {
template <class C>
int benchmark_lookup(C& container, const int n, const int strsize) {
for (int i = 0; i < n; i++)
- addRandomString(container, strsize);
+ addRandomString(container, randomString(strsize));
time_point t1 = std::chrono::high_resolution_clock::now();
int found = 0;
for (int i = 0; i < n; i++)
- found += (int)getRandomString(container, strsize);
+ found += (int)getRandomString(container, randomString(strsize));
time_point t2 = std::chrono::high_resolution_clock::now();
const auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count();
@@ -97,9 +110,9 @@ int benchmark_lookup(C& container, const int n, const int strsize) {
return (int)duration;
}
-
+#include <time.h>
int main() {
- uint64_t seed = 4321;
+ uint64_t seed = time(NULL); // 4321;
int sum, n;
// VECTOR WITH STRINGS
@@ -154,7 +167,7 @@ int main() {
csrand(seed);
sum = 0, n = 0;
std::cerr << "\nstrsize\tmsecs\tfind: robin_hood::unordered_flat_set<std::string>, size=" << BENCHMARK_SIZE/2 << "\n";
- for (int strsize = 1; strsize <= MAX_STRING_SIZE; strsize += 4) {
+ for (int strsize = 1; strsize <= MAX_STRING_SIZE; strsize += 2) {
StdSet set; set.reserve(BENCHMARK_SIZE/2);
sum += benchmark_lookup(set, BENCHMARK_SIZE/2, strsize), ++n;
std::cout << '\t' << *set.begin() << '\n';
@@ -164,7 +177,7 @@ int main() {
csrand(seed);
sum = 0, n = 0;
std::cerr << "\nstrsize\tmsecs\tfind: cset<cstr>, size=" << BENCHMARK_SIZE/2 << "\n";
- for (int strsize = 1; strsize <= MAX_STRING_SIZE; strsize += 4) {
+ for (int strsize = 1; strsize <= MAX_STRING_SIZE; strsize += 2) {
StcSet set = StcSet_with_capacity(BENCHMARK_SIZE/2);
sum += benchmark_lookup(set, BENCHMARK_SIZE/2, strsize), ++n;
std::cout << '\t' << cstr_str(StcSet_begin(&set).ref) << '\n';