summaryrefslogtreecommitdiffhomepage
path: root/misc/benchmarks/various/sso_bench.cpp
diff options
context:
space:
mode:
authorTyge Løvset <[email protected]>2023-02-12 22:47:55 +0100
committerTyge Løvset <[email protected]>2023-02-12 23:20:18 +0100
commit7dc6fddc079f4f572c8fb7c0ffd5a27e03291a2d (patch)
tree681d1894d917bc2fe244375298ea40f736c18e18 /misc/benchmarks/various/sso_bench.cpp
parent9904a7ea36f9e4f45d7e41e409ed23ad22821e8a (diff)
downloadSTC-modified-7dc6fddc079f4f572c8fb7c0ffd5a27e03291a2d.tar.gz
STC-modified-7dc6fddc079f4f572c8fb7c0ffd5a27e03291a2d.zip
Fairly large update before release 4.1, cleaning up docs and some minor additions.
Diffstat (limited to 'misc/benchmarks/various/sso_bench.cpp')
-rw-r--r--misc/benchmarks/various/sso_bench.cpp135
1 files changed, 135 insertions, 0 deletions
diff --git a/misc/benchmarks/various/sso_bench.cpp b/misc/benchmarks/various/sso_bench.cpp
new file mode 100644
index 00000000..0fffef7a
--- /dev/null
+++ b/misc/benchmarks/various/sso_bench.cpp
@@ -0,0 +1,135 @@
+#include <string>
+#include <iostream>
+#include <chrono>
+
+#include <stc/crandom.h>
+#include <stc/cstr.h>
+
+#define i_type StcVec
+#define i_val_str
+#include <stc/cstack.h>
+
+#define i_type StcSet
+#define i_val_str
+#include <stc/csset.h>
+
+#include <vector>
+using StdVec = std::vector<std::string>;
+#include <set>
+using StdSet = std::set<std::string>;
+
+
+static const int BENCHMARK_SIZE = 2000000;
+static const int MAX_STRING_SIZE = 50;
+static const char CHARS[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=+-";
+using time_point = std::chrono::high_resolution_clock::time_point;
+
+
+static inline std::string randomString_STD(int strsize) {
+ std::string s(strsize, 0);
+ char* p = &s[0];
+ union { uint64_t u8; uint8_t b[8]; } r;
+ for (int i = 0; i < strsize; ++i) {
+ if ((i & 7) == 0) r.u8 = crandom() & 0x3f3f3f3f3f3f3f3f;
+ p[i] = CHARS[r.b[i & 7]];
+ }
+ return s;
+}
+
+static inline cstr randomString_STC(int strsize) {
+ cstr s = cstr_with_size(strsize, 0);
+ char* p = cstr_data(&s);
+ union { uint64_t u8; uint8_t b[8]; } r;
+ for (int i = 0; i < strsize; ++i) {
+ if ((i & 7) == 0) r.u8 = crandom() & 0x3f3f3f3f3f3f3f3f;
+ p[i] = CHARS[r.b[i & 7]];
+ }
+ return s;
+}
+
+
+void addRandomString(StdVec& vec, int strsize) {
+ vec.push_back(std::move(randomString_STD(strsize)));
+}
+
+void addRandomString(StcVec& vec, int strsize) {
+ StcVec_push(&vec, randomString_STC(strsize));
+}
+
+void addRandomString(StdSet& set, int strsize) {
+ set.insert(std::move(randomString_STD(strsize)));
+}
+
+void addRandomString(StcSet& set, int strsize) {
+ StcSet_insert(&set, randomString_STC(strsize));
+}
+
+
+template <class C>
+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);
+
+ time_point t2 = std::chrono::high_resolution_clock::now();
+ const auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count();
+ std::cerr << (strsize ? strsize : 32) << "\t" << duration;
+ return (int)duration;
+}
+
+
+int main() {
+ uint64_t seed = 4321;
+ int sum, n;
+
+ // VECTOR WITH STRINGS
+
+ csrandom(seed);
+ sum = 0, n = 0;
+ std::cerr << "\nstrsize\tmsecs\tstd::vector<std::string>, size=" << BENCHMARK_SIZE << "\n";
+ for (int strsize = 1; strsize <= MAX_STRING_SIZE; strsize += 2) {
+ StdVec vec; vec.reserve(BENCHMARK_SIZE);
+ sum += benchmark(vec, BENCHMARK_SIZE, strsize), ++n;
+ std::cout << '\t' << vec.front() << '\n';
+ }
+ std::cout << "Avg:\t" << sum/n << '\n';
+
+ csrandom(seed);
+ sum = 0, n = 0;
+ std::cerr << "\nstrsize\tmsecs\tcvec<cstr>, size=" << BENCHMARK_SIZE << "\n";
+ for (int strsize = 1; strsize <= MAX_STRING_SIZE; strsize += 2) {
+ StcVec vec = StcVec_with_capacity(BENCHMARK_SIZE);
+ sum += benchmark(vec, BENCHMARK_SIZE, strsize), ++n;
+ std::cout << '\t' << cstr_str(&vec.data[0]) << '\n';
+ StcVec_drop(&vec);
+ }
+ std::cout << "Avg:\t" << sum/n << '\n';
+
+ // SORTED SET WITH STRINGS
+
+ csrandom(seed);
+ sum = 0, n = 0;
+ std::cerr << "\nstrsize\tmsecs\tstd::set<std::string>, size=" << BENCHMARK_SIZE/16 << "\n";
+ for (int strsize = 1; strsize <= MAX_STRING_SIZE; strsize += 2) {
+ StdSet set;
+ sum += benchmark(set, BENCHMARK_SIZE/16, strsize), ++n;
+ std::cout << '\t' << *set.begin() << '\n';
+ }
+ std::cout << "Avg:\t" << sum/n << '\n';
+
+ csrandom(seed);
+ sum = 0, n = 0;
+ std::cerr << "\nstrsize\tmsecs\tcsset<cstr>, size=" << BENCHMARK_SIZE/16 << "\n";
+ for (int strsize = 1; strsize <= MAX_STRING_SIZE; strsize += 2) {
+ StcSet set = StcSet_with_capacity(BENCHMARK_SIZE/16);
+ sum += benchmark(set, BENCHMARK_SIZE/16, strsize), ++n;
+ std::cout << '\t' << cstr_str(StcSet_front(&set)) << '\n';
+ StcSet_drop(&set);
+ }
+ std::cout << "Avg:\t" << sum/n << '\n';
+
+ std::cerr << "sizeof(std::string) : " << sizeof(std::string) << std::endl
+ << "sizeof(cstr) : " << sizeof(cstr) << std::endl;
+ return 0;
+}