From 6d8406e66c029d4c672bb7531aabec7eb1d079d8 Mon Sep 17 00:00:00 2001 From: Tyge Løvset Date: Sun, 24 Apr 2022 13:31:11 +0200 Subject: Created VERSION 3.5. See News section in docs for changes. --- benchmarks/misc/sso_bench.cpp | 115 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 benchmarks/misc/sso_bench.cpp (limited to 'benchmarks/misc/sso_bench.cpp') diff --git a/benchmarks/misc/sso_bench.cpp b/benchmarks/misc/sso_bench.cpp new file mode 100644 index 00000000..08444320 --- /dev/null +++ b/benchmarks/misc/sso_bench.cpp @@ -0,0 +1,115 @@ +#include +#include +#include +#include +#define i_type svec +#define i_val_str +#include + +#define ROTL_(x, k) (x << (k) | x >> (8*sizeof(x) - (k))) + +static uint64_t g_romutrio[3] = { + 0x26aa069ea2fb1a4dULL, 0x70c72c95cd592d04ULL, + 0x504f333d3aa0b359ULL, +}; + +static inline uint64_t romutrio(void) { + uint64_t *s = g_romutrio, xp = s[0], yp = s[1], zp = s[2]; + s[0] = 15241094284759029579u * zp; + s[1] = yp - xp; s[1] = ROTL_(s[1], 12); + s[2] = zp - yp; s[2] = ROTL_(s[2], 44); + return xp; +} + +static void sromutrio(uint64_t seed) { + uint64_t *s = g_romutrio; + s[0] = 0x26aa069ea2fb1a4dULL + seed; + s[1] = 0x70c72c95cd592d04ULL + seed; + s[2] = 0x504f333d3aa0b359ULL + seed; +} + + +static const char CHARS[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=+-"; + +static const int BENCHMARK_SIZE = 5000000; +static const int MAX_STRING_LENGTH = 25; + +using time_point = std::chrono::high_resolution_clock::time_point; + +void addRandomString_STD(std::vector& vec, const int length) { + std::string s(length, 0); + char* p = &s[0]; + for (int i = 0; i < length; ++i) { + p[i] = CHARS[romutrio() & 63]; + } + s.append(s); + vec.push_back(s); +} + +void addRandomString_STC(svec& vec, const int length) { + cstr s = cstr_with_size(length, 0); + char* p = cstr_data(&s); + for (int i = 0; i < length; ++i) { + p[i] = CHARS[romutrio() & 63]; + } + cstr_append_s(&s, s); + svec_push_back(&vec, s); +} + +template +void benchmark(L& vec, const int length, R addRandomString) { + time_point t1 = std::chrono::high_resolution_clock::now(); + + if (length == 0) + for (int i = 0; i < BENCHMARK_SIZE; i++) + addRandomString(vec, (i*13 & 31) + 1); + else + for (int i = 0; i < BENCHMARK_SIZE; i++) + addRandomString(vec, length); + + time_point t2 = std::chrono::high_resolution_clock::now(); + const auto duration = std::chrono::duration_cast(t2 - t1).count(); + std::cerr << length*2 << "\t" << duration; +} + + +int main() { + uint64_t seed = 4321; + sromutrio(seed); + std::cerr << "length\ttime\tstd::string\n"; + for (int k = 0; k < 4; k++) { + std::vector vec; vec.reserve(BENCHMARK_SIZE); + benchmark(vec, 0, addRandomString_STD); + std::cout << '\t' << vec[0] << '\n'; + } + + sromutrio(seed); + std::cerr << "\nlength\ttime\tSTC string\n"; + for (int k = 0; k < 4; k++) { + svec vec = svec_with_capacity(BENCHMARK_SIZE); + benchmark(vec, 0, addRandomString_STC); + std::cout << '\t' << cstr_str(&vec.data[0]) << '\n'; + svec_drop(&vec); + } + + sromutrio(seed); + std::cerr << "length\ttime\tstd::string\n"; + for (int length = 1; length <= MAX_STRING_LENGTH; length++) { + std::vector vec; vec.reserve(BENCHMARK_SIZE); + benchmark(vec, length, addRandomString_STD); + std::cout << '\t' << vec[0] << '\n'; + } + + sromutrio(seed); + std::cerr << "\nlength\ttime\tSTC string\n"; + for (int length = 1; length <= MAX_STRING_LENGTH; length++) { + svec vec = svec_with_capacity(BENCHMARK_SIZE); + benchmark(vec, length, addRandomString_STC); + std::cout << '\t' << cstr_str(&vec.data[0]) << '\n'; + svec_drop(&vec); + } + + std::cerr << "sizeof std::string : " << sizeof(std::string) << std::endl + << "sizeof STC string : " << sizeof(cstr) << std::endl; + return 0; +} -- cgit v1.2.3 From 8aeec88bd7f15069a388f7fc8fe0008af4d1ab44 Mon Sep 17 00:00:00 2001 From: Tyge Løvset Date: Sun, 24 Apr 2022 20:24:29 +0200 Subject: Fixed unfair comparison; std::move must be used in c++ push_back(). STC has almost identical performance to c++ STL, but STC cstr has 23 chars short strings vs typically 15 for c++ std::string, so STC is faster in this range. --- benchmarks/misc/sso_bench.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'benchmarks/misc/sso_bench.cpp') diff --git a/benchmarks/misc/sso_bench.cpp b/benchmarks/misc/sso_bench.cpp index 08444320..5ff54be9 100644 --- a/benchmarks/misc/sso_bench.cpp +++ b/benchmarks/misc/sso_bench.cpp @@ -32,7 +32,7 @@ static void sromutrio(uint64_t seed) { static const char CHARS[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=+-"; static const int BENCHMARK_SIZE = 5000000; -static const int MAX_STRING_LENGTH = 25; +static const int MAX_STRING_LENGTH = 30; using time_point = std::chrono::high_resolution_clock::time_point; @@ -43,7 +43,7 @@ void addRandomString_STD(std::vector& vec, const int length) { p[i] = CHARS[romutrio() & 63]; } s.append(s); - vec.push_back(s); + vec.push_back(std::move(s)); } void addRandomString_STC(svec& vec, const int length) { -- cgit v1.2.3