diff --git a/CMakeLists.txt b/CMakeLists.txt index d5d80b6..d7b3162 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,7 @@ include(FetchContent) project( simstr - VERSION 1.7.3 + VERSION 1.8.1 DESCRIPTION "Yet another modern C++ string library" HOMEPAGE_URL "https://github.com/orefkov/simstr" LANGUAGES CXX diff --git a/bench/bench_str.cpp b/bench/bench_str.cpp index bb57fbe..bde990e 100644 --- a/bench/bench_str.cpp +++ b/bench/bench_str.cpp @@ -1,5 +1,5 @@ /* - * ver. 1.7.2 + * ver. 1.8.1 * (c) Проект "SimStr", Александр Орефков orefkov@gmail.com * Бенчмарки * (c) Project "SimStr", Aleksandr Orefkov orefkov@gmail.com diff --git a/bench/emscripten/shell_minimal.html b/bench/emscripten/shell_minimal.html index aced9c1..fe39bae 100644 --- a/bench/emscripten/shell_minimal.html +++ b/bench/emscripten/shell_minimal.html @@ -185,7 +185,7 @@
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 libc++ | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-15 | Xeon E5-2682 v4, Windows 10, Clang-22 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-22 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Concat email std::formatstd::string email_concat_format(std::string_view name, std::string_view domain, std::string_view tld) {
+| Concat email std::formatstd::string email_concat_format(std::string_view name, std::string_view domain, std::string_view tld) {
return std::format("{}@{}.{}", name, domain, tld);
-} | 165 | 167 | 160 | 207 | 252 | 994 | Concat email std::stringstreamstd::string email_concat_stream(std::string_view name, std::string_view domain, std::string_view tld) {
+} | 167 | 170 | 160 | 201 | 256 | 483 | Concat email std::stringstreamstd::string email_concat_stream(std::string_view name, std::string_view domain, std::string_view tld) {
std::stringstream s;
s << name << "@" << domain << "." << tld;
return s.str();
-} | 325 | 268 | 318 | 808 | 909 | 2551 | Concat email stringzilla appendsz::string email_concat_stringzilla_app(sz::string name, sz::string_view domain, sz::string_view tld) {
+} | 379 | 279 | 321 | 830 | 940 | 1090 | Concat email stringzilla appendsz::string email_concat_stringzilla_app(sz::string name, sz::string_view domain, sz::string_view tld) {
return name.append("@").append(domain).append(".").append(tld);
-} | 136 | 141 | 108 | 260 | 272 | 591 | Concat email stringzilla concatsz::string email_concat_stringzilla_exp(sz::string name, sz::string_view domain, sz::string_view tld) {
+} | 143 | 141 | 108 | 273 | 287 | 230 | Concat email stringzilla concatsz::string email_concat_stringzilla_exp(sz::string name, sz::string_view domain, sz::string_view tld) {
return sz::string{name | sz::string_view{"@"} | domain | sz::string_view{"."} | tld};
} | >> В stringzilla тоже есть конкатенация строковыми выражениями, но не
так удобна и развита, как в simstr.
Stringzilla also has concatenation by expression templates,
-but it's not as convenient or advanced as simstr. | 54.8 | 58.3 | 42.7 | 125 | 127 | 222 | Concat email std::string appendstd::string email_concat_std(std::string name, std::string_view domain, std::string_view tld) {
+but it's not as convenient or advanced as simstr. | 54.6 | 55.0 | 42.8 | 126 | 134 | 92.5 | Concat email std::string appendstd::string email_concat_std(std::string name, std::string_view domain, std::string_view tld) {
return name.append("@").append(domain).append(".").append(tld);
-} | 73.7 | 94.9 | 77.9 | 182 | 196 | 643 | Concat email std::string by strexprstd::string email_concat_std_expr(std::string_view name, std::string_view domain, std::string_view tld) {
+} | 73.9 | 91.0 | 79.2 | 187 | 200 | 289 | Concat email std::string by strexprstd::string email_concat_std_expr(std::string_view name, std::string_view domain, std::string_view tld) {
return +name + "@" + domain + "." + tld;
-} | 44.8 | 45.2 | 33.6 | 106 | 111 | 164 | Concat email stringastringa email_concat_sim_expr(ssa name, ssa domain, ssa tld) {
+} | 46.8 | 46.8 | 34.4 | 104 | 113 | 88.2 | Concat email stringastringa email_concat_sim_expr(ssa name, ssa domain, ssa tld) {
return name + "@" + domain + "." + tld;
-} | 40.5 | 39.3 | 39.7 | 92.9 | 101 | 131 | | 39.1 | 38.7 | 40.7 | 94.4 | 106 | 67.4 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 libc++ | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-15 | Xeon E5-2682 v4, Windows 10, Clang-22 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-22 | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Concat std::string and number by std to std::stringvoid ConcatStdToStd(benchmark::State& state) {
+| Concat std::string and number by std to std::stringvoid ConcatStdToStd(benchmark::State& state) {
std::string s1 = "start ";
for (auto _: state) {
for (int i = 1; i <= 100'000; i *= 10) {
@@ -355,8 +355,8 @@ but it's not as convenient or advanced as simstr. | 216 | 239 | 207 | 265 | 331 | 1982 | Concat std::string and number by StrExpr to std::stringvoid ConcatSimToStd(benchmark::State& state) {
+} | 223 | 242 | 214 | 268 | 333 | 1042 | Concat std::string and number by StrExpr to std::stringvoid ConcatSimToStd(benchmark::State& state) {
std::string s1 = "start ";
for (auto _: state) {
for (int i = 1; i <= 100'000; i *= 10) {
@@ -365,8 +365,8 @@ but it's not as convenient or advanced as simstr. | 104 | 100 | 101 | 156 | 211 | 980 | Concat stringa and number by StrExpr to simstr::stringavoid ConcatSimToSim(benchmark::State& state) {
+} | 105 | 102 | 102 | 160 | 219 | 486 | Concat stringa and number by StrExpr to simstr::stringavoid ConcatSimToSim(benchmark::State& state) {
stra s1 = "start ";
for (auto _: state) {
for (int i = 1; i <= 100'000; i *= 10) {
@@ -382,8 +382,8 @@ but it's not as convenient or advanced as simstr. | 65.6 | 65.1 | 68.1 | 66.5 | 102 | 352 | Concat stringa and number by e_concat to simstr::stringavoid ConcatSimToSimConcat(benchmark::State& state) {
+while in stringa , the entire test is included in SSO. | 64.9 | 64.3 | 72.3 | 68.7 | 109 | 217 | Concat stringa and number by e_concat to simstr::stringavoid ConcatSimToSimConcat(benchmark::State& state) {
stra s1 = "start ";
for (auto _: state) {
for (int i = 1; i <= 100'000; i *= 10) {
@@ -392,17 +392,17 @@ while in stringa , the entire test is included in SSO. | 71.2 | 67.8 | 76.4 | 74.2 | 113 | 377 | | 72.3 | 72.1 | 77.7 | 74.2 | 121 | 218 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 libc++ | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-15 | Xeon E5-2682 v4, Windows 10, Clang-22 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-22 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Concat std::string and format hex number and literal to std::stringvoid ConcatStdToFmtHex(benchmark::State& state) {
+| Concat std::string and format hex number and literal to std::stringvoid ConcatStdToFmtHex(benchmark::State& state) {
// We use a short string so that the longest result is 15 characters and fits in the std::string SSO buffer.
std::string s1 = "art ";
for (auto _: state) {
@@ -413,8 +413,8 @@ while in stringa , the entire test is included in SSO. | 703 | 703 | 742 | 701 | 1043 | 3864 | std::format std::string and hex number by literal to std::stringvoid ConcatAllFmtToHex(benchmark::State& state) {
+} | 696 | 724 | 728 | 725 | 1030 | 2057 | std::format std::string and hex number by literal to std::stringvoid ConcatAllFmtToHex(benchmark::State& state) {
// We use a short string so that the longest result is 15 characters and fits in the std::string SSO buffer.
std::string s1 = "art ";
for (auto _: state) {
@@ -425,8 +425,8 @@ while in stringa , the entire test is included in SSO. | 835 | 804 | 850 | 1465 | 1834 | 5212 | Concat std::string and std::to_chars and string to std::stringvoid ConcatStdToCharsHex(benchmark::State& state) {
+} | 828 | 783 | 893 | 1525 | 1872 | 2629 | Concat std::string and std::to_chars and string to std::stringvoid ConcatStdToCharsHex(benchmark::State& state) {
// We use a short string so that the longest result is 15 characters and fits in the std::string SSO buffer.
std::string s1 = "art ";
for (auto _: state) {
@@ -439,8 +439,8 @@ while in stringa , the entire test is included in SSO. | 207 | 218 | 194 | 182 | 254 | 1159 | Concat std::string and hex number and literal by StrExpr to std::stringvoid ConcatSimToStdHex(benchmark::State& state) {
+} | 210 | 221 | 199 | 188 | 252 | 676 | Concat std::string and hex number and literal by StrExpr to std::stringvoid ConcatSimToStdHex(benchmark::State& state) {
// We use a short string so that the longest result is 15 characters and fits in the std::string SSO buffer.
std::string s1 = "art ";
for (auto _: state) {
@@ -451,8 +451,8 @@ while in stringa , the entire test is included in SSO. | 133 | 145 | 121 | 83.5 | 119 | 912 | Concat stringa and hex number and literal by StrExpr to simstr::stringavoid ConcatSimToSimHex(benchmark::State& state) {
+} | 134 | 150 | 125 | 84.6 | 115 | 526 | Concat stringa and hex number and literal by StrExpr to simstr::stringavoid ConcatSimToSimHex(benchmark::State& state) {
// stringa SSO buffer is 23, but we use a short string to compare under the same conditions
stra s1 = "art ";
for (auto _: state) {
@@ -463,8 +463,8 @@ while in stringa , the entire test is included in SSO. | 117 | 115 | 116 | 67.1 | 101 | 221 | Concat stringa and hex number and literal by e_concat to simstr::stringavoid ConcatSimToSimHexC(benchmark::State& state) {
+} | 117 | 120 | 122 | 71.4 | 101 | 189 | Concat stringa and hex number and literal by e_concat to simstr::stringavoid ConcatSimToSimHexC(benchmark::State& state) {
// stringa SSO buffer is 23, but we use a short string to compare under the same conditions
stra s1 = "art ";
for (auto _: state) {
@@ -475,8 +475,8 @@ while in stringa , the entire test is included in SSO. | 124 | 123 | 121 | 75.9 | 105 | 221 | Subst stringa and hex number by e_subst literal to simstr::stringavoid ConcatSimToSimHexS(benchmark::State& state) {
+} | 128 | 124 | 125 | 76.9 | 108 | 198 | Subst stringa and hex number by e_subst literal to simstr::stringavoid ConcatSimToSimHexS(benchmark::State& state) {
// stringa SSO buffer is 23, but we use a short string to compare under the same conditions
stra s1 = "art ";
for (auto _: state) {
@@ -486,8 +486,8 @@ while in stringa , the entire test is included in SSO. | 182 | 183 | 165 | 145 | 171 | 350 | Subst stringa and hex number by e_vsubst stra to simstr::stringavoid ConcatSimToSimHexVS(benchmark::State& state) {
+} | 193 | 187 | 172 | 149 | 173 | 355 | Subst stringa and hex number by e_vsubst stra to simstr::stringavoid ConcatSimToSimHexVS(benchmark::State& state) {
// stringa SSO buffer is 23, but we use a short string to compare under the same conditions
stra s1 = "art ";
for (auto _: state) {
@@ -497,37 +497,37 @@ while in stringa , the entire test is included in SSO. | 314 | 320 | 275 | 292 | 359 | 928 | | 333 | 332 | 280 | 287 | 361 | 843 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 libc++ | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-15 | Xeon E5-2682 v4, Windows 10, Clang-22 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-22 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
"abcdefghihklmopqr "_ss + i / 0x8a010_fmt + " end"void ConcatSimToSimOct(benchmark::State& state) {
+| "abcdefghihklmopqr "_ss + i / 0x8a010_fmt + " end"void ConcatSimToSimOct(benchmark::State& state) {
for (auto _: state) {
for (unsigned i = 1; i <= 100'000; i *= 10) {
stringa str = "abcdefghihklmopqr "_ss + i / 0x8a010_fmt + " end";
benchmark::DoNotOptimize(str);
}
}
-} | 265 | 278 | 259 | 668 | 695 | 418 | e_subst("abcdefghihklmopqr {} end", i / 0x8a010_fmt)void SubstSimToSimOct(benchmark::State& state) {
+} | 271 | 278 | 261 | 639 | 702 | 414 | e_subst("abcdefghihklmopqr {} end", i / 0x8a010_fmt)void SubstSimToSimOct(benchmark::State& state) {
for (auto _: state) {
for (unsigned i = 1; i <= 100'000; i *= 10) {
stringa str = e_subst("abcdefghihklmopqr {} end", i / 0x8a010_fmt);
benchmark::DoNotOptimize(str);
}
}
-} | 350 | 357 | 314 | 753 | 828 | 657 | e_vsubst(pattern, i / 0x8a010_fmt)void VSubstSimToSimOct(benchmark::State& state) {
+} | 357 | 358 | 315 | 750 | 810 | 621 | e_vsubst(pattern, i / 0x8a010_fmt)void VSubstSimToSimOct(benchmark::State& state) {
ssa pattern = "abcdefghihklmopqr {} end";
for (auto _: state) {
for (unsigned i = 1; i <= 100'000; i *= 10) {
@@ -535,16 +535,16 @@ while in stringa , the entire test is included in SSO. | 628 | 640 | 571 | 1052 | 1166 | 1440 | fmt::format(FMT_COMPILE("abcdefghihklmopqr {:#010o} end"), i)void FmtFormatComp(benchmark::State& state) {
+} | 621 | 608 | 593 | 1070 | 1144 | 1426 | fmt::format(FMT_COMPILE("abcdefghihklmopqr {:#010o} end"), i)void FmtFormatComp(benchmark::State& state) {
for (auto _: state) {
for (unsigned i = 1; i <= 100'000; i *= 10) {
std::string str = fmt::format(FMT_COMPILE("abcdefghihklmopqr {:#010o} end"), i);
benchmark::DoNotOptimize(str);
}
}
-} | 703 | 668 | 632 | 1408 | 1577 | 2237 | fmt::format("abcdefghihklmopqr {:#010o} end", i)void FmtFormat(benchmark::State& state) {
+} | 723 | 697 | 629 | 1433 | 1583 | 2149 | fmt::format("abcdefghihklmopqr {:#010o} end", i)void FmtFormat(benchmark::State& state) {
for (auto _: state) {
for (unsigned i = 1; i <= 100'000; i *= 10) {
std::string str = fmt::format("abcdefghihklmopqr {:#010o} end", i);
@@ -552,16 +552,16 @@ while in stringa , the entire test is included in SSO. | 873 | 795 | 747 | 1384 | 1440 | 2986 | std::format("abcdefghihklmopqr {:#010o} end", i)void FormatStdToStdOct(benchmark::State& state) {
+} | 842 | 814 | 788 | 1327 | 1596 | 2879 | std::format("abcdefghihklmopqr {:#010o} end", i)void FormatStdToStdOct(benchmark::State& state) {
for (auto _: state) {
for (unsigned i = 1; i <= 100'000; i *= 10) {
std::string str = std::format("abcdefghihklmopqr {:#010o} end", i);
benchmark::DoNotOptimize(str);
}
}
-} | 982 | 1216 | 1210 | 1574 | 1921 | 3132 | std::vformat(pattern, std::make_format_args(i))void VFormatStdToStdOct(benchmark::State& state) {
+} | 1017 | 1268 | 1171 | 1568 | 1946 | 2940 | std::vformat(pattern, std::make_format_args(i))void VFormatStdToStdOct(benchmark::State& state) {
std::string_view pattern = "abcdefghihklmopqr {:#010o} end";
for (auto _: state) {
for (unsigned i = 1; i <= 100'000; i *= 10) {
@@ -569,18 +569,21 @@ while in stringa , the entire test is included in SSO. | 975 | 1243 | 1241 | 1578 | 1914 | 3119 | std::format with std::formatted_sizevoid StdFormatSize(benchmark::State& state) {
+} | 999 | 1228 | 1176 | 1555 | 1990 | 2985 | std::format with std::formatted_sizevoid StdFormatSize(benchmark::State& state) {
for (auto _: state) {
for (unsigned i = 1; i <= 100'000; i *= 10) {
size_t len = std::formatted_size("abcdefghihklmopqr {:#010o} end", i);
- std::string str(len, 0);
- std::format_to_n(str.data(), len, "abcdefghihklmopqr {:#010o} end", i);
+ std::string str;
+ str.resize_and_overwrite(len, [&](char* p, size_t) {
+ std::format_to_n(str.data(), len, "abcdefghihklmopqr {:#010o} end", i);
+ return len;
+ });
benchmark::DoNotOptimize(str);
}
}
-} | 1818 | 2159 | 2117 | 2443 | 2861 | 5329 | strm << "abcdefghihklmopqr 0" << std::oct << std::setw(9) << std::setfill('0') << i << " end"void StreamStdToStdOct(benchmark::State& state) {
+} | 1867 | 2175 | 2267 | 2496 | 2922 | 5263 | strm << "abcdefghihklmopqr 0" << std::oct << std::setw(9) << std::setfill('0') << i << " end"void StreamStdToStdOct(benchmark::State& state) {
for (auto _: state) {
for (unsigned i = 1; i <= 100'000; i *= 10) {
std::stringstream strm;
@@ -589,22 +592,22 @@ while in stringa , the entire test is included in SSO. | 2373 | 2594 | 1954 | 6589 | 6947 | 8569 | | 2074 | 2608 | 2021 | 6707 | 7026 | 8433 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 libc++ | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-15 | Xeon E5-2682 v4, Windows 10, Clang-22 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-22 | |||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Concat std::string by std to std::stringvoid ConcatStdToStdS(benchmark::State& state) {
+| Concat std::string by std to std::stringvoid ConcatStdToStdS(benchmark::State& state) {
std::string s1 = "start ";
for (auto _: state) {
for (int i = 1; i <= 100'000; i *= 10) {
@@ -613,8 +616,8 @@ while in stringa , the entire test is included in SSO. | 47.2 | 34.0 | 45.3 | 40.4 | 55.1 | 116 | Concat std::string by StrExpr to std::stringvoid ConcatSimToStdS(benchmark::State& state) {
+} | 51.7 | 34.1 | 47.9 | 42.2 | 55.5 | 109 | Concat std::string by StrExpr to std::stringvoid ConcatSimToStdS(benchmark::State& state) {
std::string s1 = "start ";
for (auto _: state) {
for (int i = 1; i <= 100'000; i *= 10) {
@@ -623,8 +626,8 @@ while in stringa , the entire test is included in SSO. | 33.0 | 36.0 | 29.9 | 38.7 | 80.2 | 131 | Concat stringa by StrExpr to stringavoid ConcatSimToSimS(benchmark::State& state) {
+} | 36.9 | 37.3 | 35.3 | 39.3 | 77.4 | 120 | Concat stringa by StrExpr to stringavoid ConcatSimToSimS(benchmark::State& state) {
stra s1 = "start ";
for (auto _: state) {
for (int i = 1; i <= 100'000; i *= 10) {
@@ -633,41 +636,41 @@ while in stringa , the entire test is included in SSO. | 29.2 | 29.4 | 26.7 | 29.3 | 52.4 | 101 | | 31.6 | 28.3 | 27.4 | 30.6 | 52.2 | 95.4 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 libc++ | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-15 | Xeon E5-2682 v4, Windows 10, Clang-22 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-22 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Find concat three std::stringsize_t find_pos_str(std::string_view src, std::string_view name) {
+| Find concat three std::stringsize_t find_pos_str(std::string_view src, std::string_view name) {
// before C++26 we can not concatenate string and string_view...
return src.find("\n- "s + std::string{name} + " -\n");
-} | 110 | 90.6 | 116 | 205 | 223 | 214 | Find concat three strexprsize_t find_pos_exp(ssa src, ssa name) {
+} | 112 | 92.4 | 119 | 206 | 230 | 214 | Find concat three strexprsize_t find_pos_exp(ssa src, ssa name) {
return src.find(std::string{"\n- " + name + " -\n"});
-} | 52.6 | 43.1 | 38.4 | 114 | 124 | 107 | Find concat three simstrsize_t find_pos_sim(ssa src, ssa name) {
+} | 52.4 | 46.5 | 38.2 | 113 | 138 | 100.0 | Find concat three simstrsize_t find_pos_sim(ssa src, ssa name) {
return src.find(lstringa<200>{"\n- " + name + " -\n"});
} | >> Если результат конкатенации меньше 207 символов,
он собирается в буфере на стеке, без аллокации и деалокации.
If the concatenation result is less than 207 characters,
-it is collected in a stack-based buffer, without allocation or deallocation. | 18.8 | 16.6 | 14.4 | 20.8 | 28.2 | 57.6 | Find concat three stringzilla stringsize_t find_pos_sz(sz::string_view src, sz::string_view name) {
+it is collected in a stack-based buffer, without allocation or deallocation. | 18.9 | 17.0 | 15.6 | 21.2 | 28.3 | 58.2 | Find concat three stringzilla stringsize_t find_pos_sz(sz::string_view src, sz::string_view name) {
return src.find(sz::string{"\n- "}.append(name).append(" -\n"));
-} | 157 | 135 | 118 | 211 | 221 | 271 | | 153 | 176 | 125 | 215 | 232 | 268 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 libc++ | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-15 | Xeon E5-2682 v4, Windows 10, Clang-22 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-22 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
BuildTypeNameStr 0/0std::string buildTypeNameStr(std::string_view type_name, size_t prec, size_t scale) {
+| BuildTypeNameStr 0/0std::string buildTypeNameStr(std::string_view type_name, size_t prec, size_t scale) {
std::string res{type_name};
if (prec) {
res += "(" + std::to_string(prec);
@@ -677,20 +680,20 @@ it is collected in a stack-based buffer, without allocation or deallocation. | 7.23 | 6.79 | 8.40 | 8.21 | 17.5 | 23.2 | BuildTypeNameExp 0/0std::string buildTypeNameExp(ssa type_name, size_t prec, size_t scale) {
+} | 7.58 | 6.45 | 8.65 | 8.34 | 17.8 | 20.9 | BuildTypeNameExp 0/0std::string buildTypeNameExp(ssa type_name, size_t prec, size_t scale) {
if (prec) {
return type_name + "(" + prec + e_if(scale, ","_ss + scale) + ")";
}
return type_name;
-} | 6.61 | 5.99 | 6.68 | 7.48 | 14.1 | 25.8 | BuildTypeNameSim 0/0stringa buildTypeNameSim(ssa type_name, size_t prec, size_t scale) {
+} | 6.94 | 6.41 | 6.99 | 7.67 | 14.4 | 23.1 | BuildTypeNameSim 0/0stringa buildTypeNameSim(ssa type_name, size_t prec, size_t scale) {
if (prec) {
return type_name + "(" + prec + e_if(scale, ","_ss + scale) + ")";
}
return type_name;
-} | 4.20 | 4.28 | 4.83 | 7.46 | 16.3 | 21.4 | BuildTypeNameStr 10/10std::string buildTypeNameStr(std::string_view type_name, size_t prec, size_t scale) {
+} | 5.03 | 4.99 | 4.97 | 7.90 | 15.4 | 20.4 | BuildTypeNameStr 10/10std::string buildTypeNameStr(std::string_view type_name, size_t prec, size_t scale) {
std::string res{type_name};
if (prec) {
res += "(" + std::to_string(prec);
@@ -700,31 +703,31 @@ it is collected in a stack-based buffer, without allocation or deallocation. | 59.7 | 88.9 | 72.5 | 69.3 | 83.6 | 400 | BuildTypeNameExp 10/10std::string buildTypeNameExp(ssa type_name, size_t prec, size_t scale) {
+} | 59.1 | 90.0 | 76.6 | 79.5 | 80.1 | 365 | BuildTypeNameExp 10/10std::string buildTypeNameExp(ssa type_name, size_t prec, size_t scale) {
if (prec) {
return type_name + "(" + prec + e_if(scale, ","_ss + scale) + ")";
}
return type_name;
-} | 30.9 | 38.8 | 26.5 | 32.2 | 38.1 | 126 | BuildTypeNameSim 10/10stringa buildTypeNameSim(ssa type_name, size_t prec, size_t scale) {
+} | 31.0 | 39.0 | 27.9 | 33.1 | 39.4 | 116 | BuildTypeNameSim 10/10stringa buildTypeNameSim(ssa type_name, size_t prec, size_t scale) {
if (prec) {
return type_name + "(" + prec + e_if(scale, ","_ss + scale) + ")";
}
return type_name;
-} | 23.9 | 23.5 | 21.7 | 25.9 | 38.4 | 73.2 | | 23.4 | 23.6 | 22.6 | 25.2 | 38.8 | 69.0 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 libc++ | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-15 | Xeon E5-2682 v4, Windows 10, Clang-22 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-22 | |||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Concat with replace strstd::string make_str_str(std::string_view from, std::string_view pattern, std::string_view repl) {
+| Concat with replace strstd::string make_str_str(std::string_view from, std::string_view pattern, std::string_view repl) {
auto str_replace = [](std::string_view from, std::string_view pattern, std::string_view repl) {
std::string result;
for (size_t offset = 0; ;) {
@@ -740,74 +743,74 @@ it is collected in a stack-based buffer, without allocation or deallocation.";
-} | 208 | 233 | 219 | 310 | 360 | 546 | Concat with replace expstd::string make_str_exp(std::string_view from, std::string_view pattern, std::string_view repl) {
+} | 210 | 243 | 236 | 315 | 352 | 500 | Concat with replace expstd::string make_str_exp(std::string_view from, std::string_view pattern, std::string_view repl) {
return "<" + e_repl(from, pattern, repl) + ">";
} | >> В simstr строковое выражение для замены подстрок
есть "из коробки".
-simstr has a string expression for replacing substrings out of the box. | 158 | 140 | 129 | 213 | 219 | 247 | | 154 | 151 | 135 | 220 | 222 | 235 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 libc++ | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-15 | Xeon E5-2682 v4, Windows 10, Clang-22 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-22 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
std::string e;template<typename T>
+| std::string e;template<typename T>
void CreateEmpty(benchmark::State& state) {
for (auto _: state) {
T empty_string;
benchmark::DoNotOptimize(empty_string);
}
} | >> Пустые строки, ничего необычного.
-Empty lines, nothing unusual. | 1.14 | 0.742 | 1.09 | 1.09 | 2.52 | 2.35 | std::string_view e;template<typename T>
+Empty lines, nothing unusual. | 1.13 | 0.758 | 1.13 | 1.12 | 2.58 | 2.15 | std::string_view e;template<typename T>
void CreateEmpty(benchmark::State& state) {
for (auto _: state) {
T empty_string;
benchmark::DoNotOptimize(empty_string);
}
-} | 0.389 | 0.373 | 0.740 | 0.363 | 1.82 | 0.772 | ssa e;template<typename T>
+} | 0.377 | 0.380 | 0.754 | 0.369 | 1.84 | 0.740 | ssa e;template<typename T>
void CreateEmpty(benchmark::State& state) {
for (auto _: state) {
T empty_string;
benchmark::DoNotOptimize(empty_string);
}
-} | 0.370 | 0.375 | 0.181 | 0.357 | 1.81 | 0.359 | stringa e;template<typename T>
+} | 0.372 | 0.375 | 0.187 | 0.362 | 1.86 | 0.378 | stringa e;template<typename T>
void CreateEmpty(benchmark::State& state) {
for (auto _: state) {
T empty_string;
benchmark::DoNotOptimize(empty_string);
}
-} | 0.770 | 0.763 | 0.737 | 0.741 | 2.22 | 2.12 | lstringa<20> e;template<typename T>
+} | 0.763 | 0.754 | 0.753 | 0.745 | 2.22 | 2.15 | lstringa<20> e;template<typename T>
void CreateEmpty(benchmark::State& state) {
for (auto _: state) {
T empty_string;
benchmark::DoNotOptimize(empty_string);
}
-} | 1.11 | 1.10 | 1.10 | 1.08 | 2.54 | 2.26 | lstringa<40> e;template<typename T>
+} | 1.14 | 1.13 | 1.14 | 1.10 | 2.55 | 2.20 | lstringa<40> e;template<typename T>
void CreateEmpty(benchmark::State& state) {
for (auto _: state) {
T empty_string;
benchmark::DoNotOptimize(empty_string);
}
-} | 1.11 | 1.10 | 1.10 | 1.09 | 2.56 | 2.41 | | 1.14 | 1.14 | 1.15 | 1.11 | 2.57 | 2.20 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 libc++ | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-15 | Xeon E5-2682 v4, Windows 10, Clang-22 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-22 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
std::string e = "Test text";template<typename T>
+| std::string e = "Test text";template<typename T>
void CreateShortLiteral(benchmark::State& state) {
for (auto _: state) {
T empty_string = TEST_TEXT;
@@ -816,8 +819,8 @@ void CreateShortLiteral(benchmark::State& state) {
} | >> Короткий литерал помещается во внутренний буфер std::string,
время тратится только на копирование 10 байтов.
The short literal is placed in the internal std::string buffer;
-time is spent only copying 10 bytes. | 1.95 | 1.46 | 1.83 | 1.83 | 2.58 | 2.49 | std::string_view e = "Test text";template<typename T>
+time is spent only copying 10 bytes. | 1.87 | 1.51 | 1.89 | 1.84 | 2.57 | 2.47 | std::string_view e = "Test text";template<typename T>
void CreateShortLiteral(benchmark::State& state) {
for (auto _: state) {
T empty_string = TEST_TEXT;
@@ -826,15 +829,15 @@ void CreateShortLiteral(benchmark::State& state) {
} | >> И string_view, и ssa - по сути одно и то же:
указатель на текст и его длина.
Both string_view and ssa are essentially the same thing:
-a pointer to text and its length. | 0.741 | 0.741 | 0.730 | 0.718 | 1.83 | 1.08 | ssa e = "Test text";template<typename T>
+a pointer to text and its length. | 0.761 | 0.767 | 0.754 | 0.741 | 1.84 | 1.12 | ssa e = "Test text";template<typename T>
void CreateShortLiteral(benchmark::State& state) {
for (auto _: state) {
T empty_string = TEST_TEXT;
benchmark::DoNotOptimize(empty_string);
}
-} | 0.374 | 0.370 | 0.729 | 0.367 | 1.82 | 0.779 | stringa e = "Test text";template<typename T>
+} | 0.382 | 0.381 | 0.757 | 0.369 | 1.84 | 0.744 | stringa e = "Test text";template<typename T>
void CreateShortLiteral(benchmark::State& state) {
for (auto _: state) {
T empty_string = TEST_TEXT;
@@ -843,8 +846,8 @@ void CreateShortLiteral(benchmark::State& state) {
} | >> stringa при инициализации константным литералом так же
сохраняет только указатель на текст и его длину.
When initialized with a constant literal, stringa also stores
-only a pointer to the text and its length. | 1.13 | 1.12 | 1.10 | 1.10 | 2.55 | 2.17 | lstringa<20> e = "Test text";template<typename T>
+only a pointer to the text and its length. | 1.15 | 1.13 | 1.13 | 1.11 | 2.57 | 2.19 | lstringa<20> e = "Test text";template<typename T>
void CreateShortLiteral(benchmark::State& state) {
for (auto _: state) {
T empty_string = TEST_TEXT;
@@ -853,26 +856,26 @@ void CreateShortLiteral(benchmark::State& state) {
} | >> Внутреннего буфера хватает для размещения символов,
время уходит только на копирование байтов.
The internal buffer is sufficient to accommodate characters;
-time is spent only on copying bytes. | 1.93 | 1.86 | 1.83 | 1.82 | 2.53 | 2.58 | lstringa<40> e = "Test text";template<typename T>
+time is spent only on copying bytes. | 1.90 | 1.89 | 1.92 | 1.84 | 2.60 | 2.63 | lstringa<40> e = "Test text";template<typename T>
void CreateShortLiteral(benchmark::State& state) {
for (auto _: state) {
T empty_string = TEST_TEXT;
benchmark::DoNotOptimize(empty_string);
}
-} | 1.89 | 1.87 | 1.85 | 1.82 | 2.55 | 2.55 | | 1.88 | 1.86 | 1.90 | 1.85 | 2.58 | 2.61 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 libc++ | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-15 | Xeon E5-2682 v4, Windows 10, Clang-22 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-22 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
std::string e = "123456789012345678901234567890";template<typename T>
+| std::string e = "123456789012345678901234567890";template<typename T>
void CreateLongLiteral(benchmark::State& state) {
for (auto _: state) {
T empty_string{LONG_TEXT};
@@ -883,8 +886,8 @@ void CreateLongLiteral(benchmark::State& state) {
Но как же отстает аллокация под Windows от Linux'а, 20 vs 70 ns...
Here, the literal doesn't fit into the internal buffer,
and 30 bytes are allocated and copied.
-But how much slower is allocation under Windows than under Linux, 20 ns vs. 70 ns... | 20.2 | 18.8 | 19.1 | 76.0 | 78.9 | 23.4 | std::string_view e = "123456789012345678901234567890";template<typename T>
+But how much slower is allocation under Windows than under Linux, 20 ns vs. 70 ns... | 19.5 | 19.3 | 19.7 | 73.9 | 79.3 | 21.8 | std::string_view e = "123456789012345678901234567890";template<typename T>
void CreateLongLiteral(benchmark::State& state) {
for (auto _: state) {
T empty_string{LONG_TEXT};
@@ -893,23 +896,23 @@ void CreateLongLiteral(benchmark::State& state) {
} | >> string_view и ssa по прежнему ничего не делают, кроме
запоминания указателя на текст и его размера.
string_view and ssa still do nothing except
-remember the pointer to the text and its size. | 0.738 | 0.732 | 0.740 | 0.734 | 1.84 | 1.15 | ssa e = "123456789012345678901234567890";template<typename T>
+remember the pointer to the text and its size. | 0.763 | 0.745 | 0.751 | 0.736 | 1.86 | 1.10 | ssa e = "123456789012345678901234567890";template<typename T>
void CreateLongLiteral(benchmark::State& state) {
for (auto _: state) {
T empty_string{LONG_TEXT};
benchmark::DoNotOptimize(empty_string);
}
-} | 0.369 | 0.371 | 0.746 | 0.362 | 1.85 | 0.757 | stringa e = "123456789012345678901234567890";template<typename T>
+} | 0.375 | 0.374 | 0.761 | 0.369 | 1.86 | 0.741 | stringa e = "123456789012345678901234567890";template<typename T>
void CreateLongLiteral(benchmark::State& state) {
for (auto _: state) {
T empty_string{LONG_TEXT};
benchmark::DoNotOptimize(empty_string);
}
} | >> stringa на константных литералах не отстает!
-stringa doesn't lag behind on constant literals! | 1.10 | 1.11 | 1.11 | 1.09 | 2.87 | 2.17 | lstringa<20> e = "123456789012345678901234567890";template<typename T>
+stringa doesn't lag behind on constant literals! | 1.14 | 1.12 | 1.13 | 1.11 | 2.24 | 2.22 | lstringa<20> e = "123456789012345678901234567890";template<typename T>
void CreateLongLiteral(benchmark::State& state) {
for (auto _: state) {
T empty_string{LONG_TEXT};
@@ -917,8 +920,8 @@ void CreateLongLiteral(benchmark::State& state) {
}
} | >> lstringa<20> может вместить в себя до 23 символов,
Очевидно, что для 30-и символов уже нужна аллокация.
-Obviously, 30 characters already require allocation. | 20.5 | 19.2 | 20.1 | 76.7 | 76.9 | 29.8 | lstringa<40> e = "123456789012345678901234567890";template<typename T>
+Obviously, 30 characters already require allocation. | 18.0 | 18.9 | 18.3 | 73.1 | 72.7 | 22.0 | lstringa<40> e = "123456789012345678901234567890";template<typename T>
void CreateLongLiteral(benchmark::State& state) {
for (auto _: state) {
T empty_string{LONG_TEXT};
@@ -927,19 +930,19 @@ void CreateLongLiteral(benchmark::State& state) {
} | >> А в lstringa<40> влезает до 47 символов, так что просто
копируется 30 байтов.
And lstringa<40> can hold up to 47 characters, so 30
-bytes are simply copied. | 2.57 | 1.84 | 1.82 | 2.50 | 3.27 | 2.95 | | 2.68 | 1.89 | 1.91 | 2.56 | 3.32 | 2.98 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 libc++ | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-15 | Xeon E5-2682 v4, Windows 10, Clang-22 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-22 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
std::string e = "Test text"; auto c{e};template<typename T>
+| std::string e = "Test text"; auto c{e};template<typename T>
void CopyShortString(benchmark::State& state) {
T x{TEST_TEXT};
for (auto _: state) {
@@ -948,8 +951,8 @@ void CopyShortString(benchmark::State& state) {
benchmark::DoNotOptimize(x);
}
} | >> Строка в пределах SSO, так что просто копирует байты.
-The string is within the SSO, so it just copies the bytes. | 5.69 | 1.12 | 4.80 | 1.84 | 5.99 | 4.03 | std::string_view e = "Test text"; auto c{e};template<typename T>
+The string is within the SSO, so it just copies the bytes. | 5.77 | 1.18 | 5.03 | 1.84 | 5.40 | 3.72 | std::string_view e = "Test text"; auto c{e};template<typename T>
void CopyShortString(benchmark::State& state) {
T x{TEST_TEXT};
for (auto _: state) {
@@ -957,8 +960,8 @@ void CopyShortString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 0.372 | 0.373 | 0.366 | 0.368 | 3.47 | 1.15 | ssa e = "Test text"; auto c{e};template<typename T>
+} | 0.388 | 0.377 | 0.388 | 0.373 | 2.95 | 1.10 | ssa e = "Test text"; auto c{e};template<typename T>
void CopyShortString(benchmark::State& state) {
T x{TEST_TEXT};
for (auto _: state) {
@@ -969,8 +972,8 @@ void CopyShortString(benchmark::State& state) {
} | >> ssa и string_view не владеют строкой, копируется
только информация о строке.
ssa and string_view don't own the string; only the
-string information is copied. | 0.377 | 0.368 | 0.375 | 0.367 | 3.46 | 1.09 | stringa e = "Test text"; auto c{e};template<typename T>
+string information is copied. | 0.380 | 0.378 | 0.388 | 0.380 | 2.95 | 1.11 | stringa e = "Test text"; auto c{e};template<typename T>
void CopyShortString(benchmark::State& state) {
T x{TEST_TEXT};
for (auto _: state) {
@@ -981,8 +984,8 @@ void CopyShortString(benchmark::State& state) {
} | >> Копирование stringa происходит быстро,
особенно если она инициализирована литералом.
Copying a stringa is fast,
-especially if it is initialized with a literal. | 1.12 | 1.10 | 1.10 | 1.08 | 4.00 | 2.49 | lstringa<20> e = "Test text"; auto c{e};template<typename T>
+especially if it is initialized with a literal. | 1.12 | 1.13 | 1.13 | 1.10 | 4.12 | 2.53 | lstringa<20> e = "Test text"; auto c{e};template<typename T>
void CopyShortString(benchmark::State& state) {
T x{TEST_TEXT};
for (auto _: state) {
@@ -991,8 +994,8 @@ void CopyShortString(benchmark::State& state) {
benchmark::DoNotOptimize(x);
}
} | >> В обоих случаях хватает внутреннего буфера.
-In both cases, the internal buffer is sufficient. | 1.12 | 1.11 | 1.44 | 1.10 | 4.77 | 4.74 | lstringa<40> e = "Test text"; auto c{e};template<typename T>
+In both cases, the internal buffer is sufficient. | 1.14 | 1.12 | 1.15 | 1.12 | 4.78 | 4.17 | lstringa<40> e = "Test text"; auto c{e};template<typename T>
void CopyShortString(benchmark::State& state) {
T x{TEST_TEXT};
for (auto _: state) {
@@ -1001,19 +1004,19 @@ void CopyShortString(benchmark::State& state) {
benchmark::DoNotOptimize(x);
}
} | >> Только копируются байты.
-Only bytes are copied. | 1.14 | 1.82 | 1.45 | 1.10 | 4.89 | 5.17 | | 1.15 | 1.85 | 1.15 | 1.11 | 5.49 | 4.49 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 libc++ | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-15 | Xeon E5-2682 v4, Windows 10, Clang-22 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-22 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
std::string e = "123456789012345678901234567890"; auto c{e};template<typename T>
+| std::string e = "123456789012345678901234567890"; auto c{e};template<typename T>
void CopyLongString(benchmark::State& state) {
T x = LONG_TEXT;
for (auto _: state) {
@@ -1023,24 +1026,24 @@ void CopyLongString(benchmark::State& state) {
} | >> Копирования длинной строки вызывает аллокацию,
SSO уже не хватает. И снова как же отстаёт аллокация под Windows...
Copying a long string causes allocations,
-SSO is no longer sufficient. And again, how allocation lags under Windows... | 19.8 | 24.0 | 22.5 | 74.9 | 74.9 | 49.0 | std::string_view e = "123456789012345678901234567890"; auto c{e};template<typename T>
+SSO is no longer sufficient. And again, how allocation lags under Windows... | 20.2 | 24.9 | 23.2 | 78.0 | 78.8 | 46.5 | std::string_view e = "123456789012345678901234567890"; auto c{e};template<typename T>
void CopyLongString(benchmark::State& state) {
T x = LONG_TEXT;
for (auto _: state) {
T copy{x};
benchmark::DoNotOptimize(copy);
}
-} | 0.738 | 0.737 | 0.730 | 0.731 | 1.83 | 1.07 | ssa e = "123456789012345678901234567890"; auto c{e};template<typename T>
+} | 0.758 | 0.757 | 0.759 | 0.734 | 1.50 | 1.11 | ssa e = "123456789012345678901234567890"; auto c{e};template<typename T>
void CopyLongString(benchmark::State& state) {
T x = LONG_TEXT;
for (auto _: state) {
T copy{x};
benchmark::DoNotOptimize(copy);
}
-} | 0.373 | 0.372 | 0.733 | 0.365 | 1.81 | 0.784 | stringa e = "123456789012345678901234567890"; auto c{e};template<typename T>
+} | 0.374 | 0.381 | 0.758 | 0.377 | 1.47 | 0.750 | stringa e = "123456789012345678901234567890"; auto c{e};template<typename T>
void CopyLongString(benchmark::State& state) {
T x = LONG_TEXT;
for (auto _: state) {
@@ -1050,8 +1053,8 @@ void CopyLongString(benchmark::State& state) {
} | >> А вот у stringa копирование литерала не зависит от его длины,
сравни с предыдущим бенчмарком.
But with stringa, literal copying doesn't depend on its length,
-compare with the previous benchmark. | 1.12 | 1.12 | 6.70 | 1.08 | 2.90 | 2.28 | lstringa<20> e = "123456789012345678901234567890"; auto c{e};template<typename T>
+compare with the previous benchmark. | 1.14 | 1.14 | 6.85 | 1.12 | 2.98 | 2.21 | lstringa<20> e = "123456789012345678901234567890"; auto c{e};template<typename T>
void CopyLongString(benchmark::State& state) {
T x = LONG_TEXT;
for (auto _: state) {
@@ -1059,8 +1062,8 @@ void CopyLongString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
}
} | >> Не влезает, аллокация.
-Doesn't fit, allocation. | 20.4 | 18.2 | 19.5 | 75.1 | 81.1 | 23.8 | lstringa<40> e = "123456789012345678901234567890"; auto c{e};template<typename T>
+Doesn't fit, allocation. | 19.1 | 18.0 | 17.7 | 72.6 | 82.9 | 21.2 | lstringa<40> e = "123456789012345678901234567890"; auto c{e};template<typename T>
void CopyLongString(benchmark::State& state) {
T x = LONG_TEXT;
for (auto _: state) {
@@ -1068,19 +1071,19 @@ void CopyLongString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
}
} | >> Уложили во внутренний буфер.
-Placed in the internal buffer. | 4.74 | 5.02 | 4.07 | 4.88 | 7.73 | 16.7 | | 4.98 | 5.53 | 4.18 | 5.42 | 7.41 | 15.8 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 libc++ | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-15 | Xeon E5-2682 v4, Windows 10, Clang-22 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-22 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
sz::string::find;template<typename T>
+| sz::string::find;template<typename T>
void Find(benchmark::State& state) {
T x{LONG_TEXT LONG_TEXT LONG_TEXT TEST_TEXT};
for (auto _: state) {
@@ -1095,8 +1098,8 @@ void Find(benchmark::State& state) {
benchmark::DoNotOptimize(x);
}
} | >> stringzilla более заточена на поиск больших строк в больших строках.
-stringzilla is more focused on searching large strings within large strings. | 98.1 | 96.2 | 84.9 | 95.3 | 115 | 123 | std::string::find;template<typename T>
+stringzilla is more focused on searching large strings within large strings. | 95.9 | 96.5 | 87.9 | 94.8 | 117 | 125 | std::string::find;template<typename T>
void Find(benchmark::State& state) {
T x{LONG_TEXT LONG_TEXT LONG_TEXT TEST_TEXT};
for (auto _: state) {
@@ -1113,8 +1116,8 @@ void Find(benchmark::State& state) {
} | >> Здесь "победила дружба", у всех типов по колонке примерно одинаково.
Однако, Windows и Linux явно в разных весовых категориях.
Here, "friendship wins," with all types scoring roughly equally.
-However, Windows and Linux are clearly in different weight classes. | 7.04 | 7.46 | 6.64 | 39.1 | 40.5 | 43.8 | std::string_view::find;template<typename T>
+However, Windows and Linux are clearly in different weight classes. | 7.34 | 7.76 | 6.95 | 40.2 | 40.3 | 40.8 | std::string_view::find;template<typename T>
void Find(benchmark::State& state) {
T x{LONG_TEXT LONG_TEXT LONG_TEXT TEST_TEXT};
for (auto _: state) {
@@ -1128,8 +1131,8 @@ void Find(benchmark::State& state) {
benchmark::DoNotOptimize(i);
benchmark::DoNotOptimize(x);
}
-} | 7.15 | 7.13 | 7.05 | 37.9 | 39.5 | 41.6 | ssa::find;template<typename T>
+} | 7.81 | 7.82 | 7.39 | 39.3 | 39.8 | 41.2 | ssa::find;template<typename T>
void Find(benchmark::State& state) {
T x{LONG_TEXT LONG_TEXT LONG_TEXT TEST_TEXT};
for (auto _: state) {
@@ -1143,8 +1146,8 @@ void Find(benchmark::State& state) {
benchmark::DoNotOptimize(i);
benchmark::DoNotOptimize(x);
}
-} | 7.45 | 6.97 | 6.73 | 18.1 | 22.0 | 41.1 | stringa::find;template<typename T>
+} | 7.37 | 7.82 | 6.87 | 18.7 | 21.9 | 40.6 | stringa::find;template<typename T>
void Find(benchmark::State& state) {
T x{LONG_TEXT LONG_TEXT LONG_TEXT TEST_TEXT};
for (auto _: state) {
@@ -1158,8 +1161,8 @@ void Find(benchmark::State& state) {
benchmark::DoNotOptimize(i);
benchmark::DoNotOptimize(x);
}
-} | 8.20 | 7.88 | 7.01 | 19.2 | 29.9 | 40.6 | lstringa<20>::find;template<typename T>
+} | 8.14 | 8.60 | 7.21 | 19.6 | 29.4 | 41.2 | lstringa<20>::find;template<typename T>
void Find(benchmark::State& state) {
T x{LONG_TEXT LONG_TEXT LONG_TEXT TEST_TEXT};
for (auto _: state) {
@@ -1173,8 +1176,8 @@ void Find(benchmark::State& state) {
benchmark::DoNotOptimize(i);
benchmark::DoNotOptimize(x);
}
-} | 6.82 | 6.73 | 6.53 | 17.2 | 21.9 | 39.8 | lstringa<40>::find;template<typename T>
+} | 6.94 | 6.98 | 6.52 | 18.0 | 24.4 | 39.8 | lstringa<40>::find;template<typename T>
void Find(benchmark::State& state) {
T x{LONG_TEXT LONG_TEXT LONG_TEXT TEST_TEXT};
for (auto _: state) {
@@ -1188,20 +1191,20 @@ void Find(benchmark::State& state) {
benchmark::DoNotOptimize(i);
benchmark::DoNotOptimize(x);
}
-} | 6.70 | 6.79 | 6.27 | 17.6 | 22.9 | 39.2 | | 6.93 | 7.01 | 6.49 | 18.5 | 23.1 | 39.7 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 libc++ | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-15 | Xeon E5-2682 v4, Windows 10, Clang-22 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-22 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
std::string copy{str_with_len_N};/15template<typename T>
+| std::string copy{str_with_len_N};/15template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1209,8 +1212,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 5.24 | 1.17 | 4.85 | 1.90 | 5.09 | 45.0 | std::string copy{str_with_len_N};/16template<typename T>
+} | 5.78 | 1.18 | 5.01 | 1.83 | 5.18 | 52.3 | std::string copy{str_with_len_N};/16template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1223,8 +1226,8 @@ void CopyDynString(benchmark::State& state) {
SSO у std::string меньше, 10 символов + 0.
The jump where SSO ends and allocation begins is clearly visible.
Note that WASM is 32-bit, and the size of the SSO for std::string is
-smaller, as far as I remember: 11 characters + 0. | 23.2 | 1.22 | 27.2 | 79.1 | 82.6 | 51.9 | std::string copy{str_with_len_N};/23template<typename T>
+smaller, as far as I remember: 11 characters + 0. | 24.5 | 1.16 | 29.4 | 78.7 | 83.5 | 53.0 | std::string copy{str_with_len_N};/23template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1233,8 +1236,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(x);
}
} | >> Дальше просто добавляется время на копирование байтов.
-Then the time for copying bytes is simply added. | 27.4 | 23.9 | 27.7 | 77.6 | 83.1 | 48.6 | std::string copy{str_with_len_N};/24template<typename T>
+Then the time for copying bytes is simply added. | 28.5 | 25.8 | 28.9 | 79.1 | 82.0 | 52.5 | std::string copy{str_with_len_N};/24template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1242,8 +1245,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 22.6 | 24.6 | 21.2 | 78.3 | 83.0 | 49.6 | std::string copy{str_with_len_N};/32template<typename T>
+} | 23.3 | 24.8 | 22.3 | 80.3 | 83.5 | 51.6 | std::string copy{str_with_len_N};/32template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1251,8 +1254,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 22.1 | 23.8 | 22.3 | 81.9 | 85.5 | 53.9 | std::string copy{str_with_len_N};/64template<typename T>
+} | 23.2 | 24.7 | 21.5 | 79.6 | 89.4 | 53.9 | std::string copy{str_with_len_N};/64template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1260,8 +1263,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 22.2 | 25.7 | 23.2 | 80.8 | 90.0 | 52.8 | std::string copy{str_with_len_N};/128template<typename T>
+} | 23.3 | 26.2 | 24.6 | 80.7 | 90.6 | 54.4 | std::string copy{str_with_len_N};/128template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1269,8 +1272,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 24.7 | 26.5 | 28.4 | 84.0 | 89.5 | 59.2 | std::string copy{str_with_len_N};/256template<typename T>
+} | 24.9 | 26.8 | 24.2 | 84.2 | 90.0 | 59.7 | std::string copy{str_with_len_N};/256template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1278,8 +1281,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 24.8 | 27.7 | 25.2 | 86.9 | 91.4 | 77.3 | std::string copy{str_with_len_N};/512template<typename T>
+} | 26.0 | 27.5 | 25.7 | 87.3 | 91.8 | 73.8 | std::string copy{str_with_len_N};/512template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1287,8 +1290,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 29.1 | 31.2 | 27.8 | 89.8 | 93.4 | 86.0 | std::string copy{str_with_len_N};/1024template<typename T>
+} | 29.4 | 31.6 | 28.5 | 87.3 | 96.2 | 81.2 | std::string copy{str_with_len_N};/1024template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1296,8 +1299,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 47.8 | 38.2 | 35.5 | 97.2 | 98.8 | 106 | std::string copy{str_with_len_N};/2048template<typename T>
+} | 47.7 | 38.4 | 33.4 | 97.6 | 102 | 93.3 | std::string copy{str_with_len_N};/2048template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1305,8 +1308,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 123 | 86.4 | 118 | 126 | 132 | 119 | std::string copy{str_with_len_N};/4096template<typename T>
+} | 125 | 86.0 | 122 | 132 | 132 | 109 | std::string copy{str_with_len_N};/4096template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1315,8 +1318,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(x);
}
} | >> Чем длиннее строка, тем дольше создаётся копия.
-The longer the string, the longer it takes to create a copy. | 146 | 115 | 154 | 180 | 181 | 165 | stringa copy{str_with_len_N};/15template<typename T>
+The longer the string, the longer it takes to create a copy. | 152 | 117 | 157 | 180 | 184 | 165 | stringa copy{str_with_len_N};/15template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1327,8 +1330,8 @@ void CopyDynString(benchmark::State& state) {
} | >> Здесь stringa инициализируется не литералом,
а значит, должна сама хранить символы.
Here, stringa is not initialized with a literal,
-meaning it must store characters itself. | 1.11 | 1.10 | 1.10 | 1.07 | 4.03 | 2.50 | stringa copy{str_with_len_N};/16template<typename T>
+meaning it must store characters itself. | 1.12 | 1.13 | 1.13 | 1.09 | 4.04 | 2.46 | stringa copy{str_with_len_N};/16template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1341,8 +1344,8 @@ void CopyDynString(benchmark::State& state) {
инкремент заменён на обычный, судя по времени.
Under WASM, stringa has a 15-character SSO. Furthermore,
it was built without thread support, so the atomic
-increment was replaced with a regular one, judging by the time. | 1.11 | 1.14 | 1.12 | 1.08 | 4.07 | 4.92 | stringa copy{str_with_len_N};/23template<typename T>
+increment was replaced with a regular one, judging by the time. | 1.13 | 1.13 | 1.15 | 1.08 | 4.07 | 4.57 | stringa copy{str_with_len_N};/23template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1353,8 +1356,8 @@ void CopyDynString(benchmark::State& state) {
} | >> SSO в stringa до 23 символов, и даже 23
копируются быстрее, чем 15 в std::string.
SSO in stringa is up to 23 characters, and even 23
-copies faster than 15 in std::string. | 1.12 | 1.11 | 1.10 | 1.08 | 3.99 | 4.77 | stringa copy{str_with_len_N};/24template<typename T>
+copies faster than 15 in std::string. | 1.12 | 1.13 | 1.13 | 1.09 | 4.09 | 4.54 | stringa copy{str_with_len_N};/24template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1365,8 +1368,8 @@ void CopyDynString(benchmark::State& state) {
} | >> Всё, не влезаем в SSO, а значит, используем shared буфер.
Добавляется время на атомарный инкремент счётчика.
That's it, we're not using SSO, so we're using a shared buffer.
-Time is added for the atomic counter increment. | 16.3 | 16.0 | 16.1 | 15.8 | 18.4 | 4.73 | stringa copy{str_with_len_N};/32template<typename T>
+Time is added for the atomic counter increment. | 16.4 | 16.5 | 16.4 | 16.1 | 18.8 | 4.55 | stringa copy{str_with_len_N};/32template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1374,8 +1377,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 16.1 | 16.0 | 16.1 | 15.9 | 18.4 | 4.77 | stringa copy{str_with_len_N};/64template<typename T>
+} | 16.3 | 16.5 | 16.4 | 16.1 | 18.6 | 4.57 | stringa copy{str_with_len_N};/64template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1383,8 +1386,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 16.1 | 16.1 | 16.1 | 15.8 | 18.4 | 4.76 | stringa copy{str_with_len_N};/128template<typename T>
+} | 16.3 | 16.5 | 16.5 | 16.0 | 18.6 | 4.56 | stringa copy{str_with_len_N};/128template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1392,8 +1395,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 15.9 | 16.2 | 16.0 | 15.8 | 18.4 | 4.74 | stringa copy{str_with_len_N};/256template<typename T>
+} | 16.4 | 16.5 | 16.4 | 16.1 | 18.6 | 4.55 | stringa copy{str_with_len_N};/256template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1401,8 +1404,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 16.0 | 16.3 | 16.0 | 15.8 | 18.7 | 4.74 | stringa copy{str_with_len_N};/512template<typename T>
+} | 16.4 | 16.6 | 16.5 | 16.1 | 18.7 | 4.57 | stringa copy{str_with_len_N};/512template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1410,8 +1413,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 16.1 | 16.0 | 16.0 | 15.8 | 18.5 | 4.75 | stringa copy{str_with_len_N};/1024template<typename T>
+} | 16.4 | 16.6 | 16.3 | 16.0 | 19.1 | 4.60 | stringa copy{str_with_len_N};/1024template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1419,8 +1422,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 16.0 | 16.0 | 16.0 | 15.8 | 18.5 | 4.75 | stringa copy{str_with_len_N};/2048template<typename T>
+} | 16.3 | 16.5 | 16.4 | 16.1 | 18.7 | 4.57 | stringa copy{str_with_len_N};/2048template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1428,8 +1431,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 16.1 | 16.2 | 15.9 | 15.8 | 18.4 | 5.34 | stringa copy{str_with_len_N};/4096template<typename T>
+} | 16.4 | 16.5 | 16.4 | 16.0 | 18.7 | 4.56 | stringa copy{str_with_len_N};/4096template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1440,8 +1443,8 @@ void CopyDynString(benchmark::State& state) {
} | >> И как видно, кроме инкремента нет накладных расходов,
время копирования не зависит от длины строки.
And as you can see, there are no overhead costs other than the
-increment; copying time does not depend on the string length. | 16.0 | 16.0 | 16.1 | 15.8 | 18.4 | 5.09 | lstringa<16> copy{str_with_len_N};/15template<typename T>
+increment; copying time does not depend on the string length. | 16.4 | 16.7 | 16.5 | 16.1 | 18.7 | 4.57 | lstringa<16> copy{str_with_len_N};/15template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1452,8 +1455,8 @@ void CopyDynString(benchmark::State& state) {
} | >> lstringa<16> использует SSO до 23 символов.
А в WASM 32-битная архитектура, SSO до 19 символов.
lstringa<16> uses SSO up to 23 characters.
-WASM has a 32-bit architecture, so SSO is up to 19 characters. | 1.11 | 1.13 | 1.47 | 1.10 | 4.55 | 4.26 | lstringa<16> copy{str_with_len_N};/16template<typename T>
+WASM has a 32-bit architecture, so SSO is up to 19 characters. | 1.14 | 1.12 | 1.15 | 1.12 | 4.06 | 4.14 | lstringa<16> copy{str_with_len_N};/16template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1461,8 +1464,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 5.42 | 5.27 | 4.43 | 4.79 | 9.64 | 16.3 | lstringa<16> copy{str_with_len_N};/23template<typename T>
+} | 5.10 | 5.35 | 4.89 | 4.56 | 8.48 | 16.9 | lstringa<16> copy{str_with_len_N};/23template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1470,8 +1473,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 5.17 | 5.22 | 4.43 | 4.81 | 9.66 | 36.5 | lstringa<16> copy{str_with_len_N};/24template<typename T>
+} | 5.16 | 5.31 | 4.91 | 4.49 | 8.54 | 36.0 | lstringa<16> copy{str_with_len_N};/24template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1480,8 +1483,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(x);
}
} | >> И после начинает вести себя при копировании, как std::string.
-And then it starts to behave like std::string when copied. | 23.2 | 23.1 | 23.3 | 77.2 | 82.0 | 37.9 | lstringa<16> copy{str_with_len_N};/32template<typename T>
+And then it starts to behave like std::string when copied. | 21.9 | 21.8 | 22.4 | 76.6 | 81.2 | 37.0 | lstringa<16> copy{str_with_len_N};/32template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1489,8 +1492,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 23.1 | 22.8 | 24.0 | 80.7 | 83.4 | 39.6 | lstringa<16> copy{str_with_len_N};/64template<typename T>
+} | 22.1 | 21.9 | 22.5 | 77.3 | 84.1 | 38.0 | lstringa<16> copy{str_with_len_N};/64template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1498,8 +1501,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 24.9 | 24.2 | 25.3 | 77.3 | 84.9 | 39.5 | lstringa<16> copy{str_with_len_N};/128template<typename T>
+} | 23.4 | 23.1 | 24.3 | 79.3 | 82.4 | 38.3 | lstringa<16> copy{str_with_len_N};/128template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1507,8 +1510,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 24.9 | 23.9 | 40.0 | 83.4 | 88.6 | 39.7 | lstringa<16> copy{str_with_len_N};/256template<typename T>
+} | 24.5 | 25.7 | 33.8 | 82.6 | 85.6 | 38.8 | lstringa<16> copy{str_with_len_N};/256template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1516,8 +1519,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 27.3 | 26.8 | 27.0 | 86.6 | 88.4 | 63.9 | lstringa<16> copy{str_with_len_N};/512template<typename T>
+} | 25.4 | 24.8 | 25.9 | 83.7 | 87.1 | 62.4 | lstringa<16> copy{str_with_len_N};/512template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1525,8 +1528,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 29.8 | 29.0 | 29.1 | 88.1 | 91.7 | 71.1 | lstringa<16> copy{str_with_len_N};/1024template<typename T>
+} | 28.6 | 27.7 | 34.8 | 88.5 | 90.7 | 66.7 | lstringa<16> copy{str_with_len_N};/1024template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1534,8 +1537,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 95.4 | 78.3 | 97.4 | 94.7 | 95.5 | 84.9 | lstringa<16> copy{str_with_len_N};/2048template<typename T>
+} | 98.9 | 78.4 | 99.7 | 93.9 | 101 | 78.8 | lstringa<16> copy{str_with_len_N};/2048template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1543,8 +1546,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 105 | 74.6 | 107 | 126 | 126 | 104 | lstringa<16> copy{str_with_len_N};/4096template<typename T>
+} | 103 | 73.4 | 110 | 125 | 135 | 94.8 | lstringa<16> copy{str_with_len_N};/4096template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1552,8 +1555,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 122 | 89.5 | 121 | 191 | 186 | 145 | lstringa<512> copy{str_with_len_N};/15template<typename T>
+} | 122 | 88.6 | 129 | 190 | 196 | 146 | lstringa<512> copy{str_with_len_N};/15template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1561,8 +1564,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 1.13 | 1.14 | 1.47 | 1.10 | 4.41 | 4.67 | lstringa<512> copy{str_with_len_N};/16template<typename T>
+} | 1.13 | 1.13 | 1.15 | 1.14 | 4.46 | 4.06 | lstringa<512> copy{str_with_len_N};/16template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1570,8 +1573,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 5.12 | 4.80 | 4.39 | 5.36 | 9.30 | 16.9 | lstringa<512> copy{str_with_len_N};/23template<typename T>
+} | 5.00 | 4.98 | 4.22 | 6.12 | 8.96 | 15.1 | lstringa<512> copy{str_with_len_N};/23template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1579,8 +1582,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 4.98 | 4.97 | 4.40 | 5.23 | 9.29 | 16.2 | lstringa<512> copy{str_with_len_N};/24template<typename T>
+} | 4.92 | 5.01 | 4.24 | 5.29 | 8.92 | 15.1 | lstringa<512> copy{str_with_len_N};/24template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1588,8 +1591,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 4.45 | 4.42 | 4.15 | 5.19 | 9.52 | 16.0 | lstringa<512> copy{str_with_len_N};/32template<typename T>
+} | 29.6 | 4.59 | 4.26 | 5.27 | 9.07 | 15.2 | lstringa<512> copy{str_with_len_N};/32template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1597,8 +1600,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 4.66 | 4.72 | 4.19 | 8.30 | 12.3 | 20.1 | lstringa<512> copy{str_with_len_N};/64template<typename T>
+} | 29.6 | 4.64 | 4.20 | 8.14 | 12.6 | 16.9 | lstringa<512> copy{str_with_len_N};/64template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1606,8 +1609,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 6.03 | 6.10 | 5.94 | 8.01 | 12.0 | 20.1 | lstringa<512> copy{str_with_len_N};/128template<typename T>
+} | 30.2 | 6.06 | 5.67 | 8.48 | 12.5 | 17.9 | lstringa<512> copy{str_with_len_N};/128template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1615,8 +1618,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 6.41 | 6.39 | 5.93 | 8.45 | 13.0 | 20.3 | lstringa<512> copy{str_with_len_N};/256template<typename T>
+} | 30.5 | 6.63 | 6.29 | 8.58 | 12.9 | 18.2 | lstringa<512> copy{str_with_len_N};/256template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1624,8 +1627,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 7.85 | 8.09 | 7.87 | 9.56 | 13.8 | 21.6 | lstringa<512> copy{str_with_len_N};/512template<typename T>
+} | 21.7 | 17.3 | 7.98 | 9.69 | 14.0 | 20.8 | lstringa<512> copy{str_with_len_N};/512template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1636,8 +1639,8 @@ void CopyDynString(benchmark::State& state) {
} | >> Даже 512 символов копируются быстрее, чем
одна аллокация или атомарный инкремент.
Even 512 characters are copied faster than a single
-allocation or atomic increment. | 10.6 | 10.5 | 10.2 | 11.0 | 15.3 | 24.0 | lstringa<512> copy{str_with_len_N};/1024template<typename T>
+allocation or atomic increment. | 24.7 | 10.6 | 10.2 | 11.4 | 15.7 | 24.0 | lstringa<512> copy{str_with_len_N};/1024template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1646,8 +1649,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(x);
}
} | >> А дальше уже как у всех.
-And then it's like everyone else. | 98.1 | 51.8 | 97.0 | 98.2 | 95.2 | 82.6 | lstringa<512> copy{str_with_len_N};/2048template<typename T>
+And then it's like everyone else. | 96.9 | 52.1 | 96.5 | 98.3 | 95.0 | 78.6 | lstringa<512> copy{str_with_len_N};/2048template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1655,8 +1658,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 104 | 73.1 | 105 | 132 | 129 | 103 | lstringa<512> copy{str_with_len_N};/4096template<typename T>
+} | 106 | 73.6 | 103 | 130 | 128 | 95.8 | lstringa<512> copy{str_with_len_N};/4096template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1664,61 +1667,61 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 121 | 86.2 | 123 | 185 | 195 | 152 | | 123 | 90.1 | 126 | 188 | 193 | 146 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 libc++ | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-15 | Xeon E5-2682 v4, Windows 10, Clang-22 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-22 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
std::string s = "123456789"; int res = std::strtol(s.c_str(), 0, 10);void ToIntStr10(benchmark::State& state, const std::string& s, int c) {
+| std::string s = "123456789"; int res = std::strtol(s.c_str(), 0, 10);void ToIntStr10(benchmark::State& state, const std::string& s, int c) {
for (auto _: state) {
int res = std::strtol(s.c_str(), nullptr, 10);
#ifdef CHECK_RESULT
@@ -1737,8 +1740,8 @@ void CopyDynString(benchmark::State& state) {
In simstr, a string fragment is sufficient for conversion to a number;
there's no need for null termination. The closest analog to this behavior
is "std::from_chars," but unfortunately, it is very limited in its capabilities.
-Here, I attempted to run tests that are similar in logic to std::from_chars. | 27.4 | 27.0 | 26.3 | 30.7 | 34.4 | 96.0 | std::string_view s = "123456789"; std::from_chars(s.data(), s.data() + s.size(), res, 10);void ToIntFromChars10(benchmark::State& state, const std::string_view& s, int c) {
+Here, I attempted to run tests that are similar in logic to std::from_chars. | 26.9 | 27.4 | 27.9 | 31.4 | 31.9 | 91.7 | std::string_view s = "123456789"; std::from_chars(s.data(), s.data() + s.size(), res, 10);void ToIntFromChars10(benchmark::State& state, const std::string_view& s, int c) {
for (auto _: state) {
int res = 0;
std::from_chars(s.data(), s.data() + s.size(), res, 10);
@@ -1753,8 +1756,8 @@ Here, I attempted to run tests that are similar in logic to std::from_chars. | >> from_chars требует точного указания основания счисления,
не допускает знаков плюс, пробелов, префиксов 0x и т.п.
from_chars requires an exact radix specification and does not allow plus
-signs, spaces, 0x prefixes, etc. | 13.5 | 17.0 | 11.5 | 12.5 | 12.6 | 0.787 | stringa s = "123456789"; int res = s.to_int<int, true, 10, false>template<typename T>
+signs, spaces, 0x prefixes, etc. | 14.9 | 17.5 | 12.5 | 12.6 | 11.8 | 0.739 | stringa s = "123456789"; int res = s.to_int<int, true, 10, false>template<typename T>
void ToIntSimStr10(benchmark::State& state, T t, int c) {
for (auto _: state) {
int res = t. template to_int<int, true, 10, false, false>().value;
@@ -1770,8 +1773,8 @@ void ToIntSimStr10(benchmark::State& state, T t, int c) {
} | >> Здесь для to_int заданы такие же ограничения - проверять переполнение,
десятичная система, без лидирующих пробелов и знака плюс
Here, to_int has the same restrictions: check for overflow,
-decimal system, no leading spaces, and no plus sign. | 9.15 | 9.41 | 16.5 | 13.8 | 17.7 | 19.6 | ssa s = "123456789"; int res = s.to_int<int, true, 10, false>template<typename T>
+decimal system, no leading spaces, and no plus sign. | 9.36 | 9.48 | 16.8 | 13.7 | 16.8 | 20.4 | ssa s = "123456789"; int res = s.to_int<int, true, 10, false>template<typename T>
void ToIntSimStr10(benchmark::State& state, T t, int c) {
for (auto _: state) {
int res = t. template to_int<int, true, 10, false, false>().value;
@@ -1784,8 +1787,8 @@ void ToIntSimStr10(benchmark::State& state, T t, int c) {
benchmark::DoNotOptimize(res);
benchmark::DoNotOptimize(t);
}
-} | 9.46 | 9.40 | 7.41 | 9.19 | 16.3 | 20.8 | lstringa<20> s = "123456789"; int res = s.to_int<int, true, 10, false>template<typename T>
+} | 9.52 | 9.76 | 7.54 | 9.40 | 15.6 | 16.2 | lstringa<20> s = "123456789"; int res = s.to_int<int, true, 10, false>template<typename T>
void ToIntSimStr10(benchmark::State& state, T t, int c) {
for (auto _: state) {
int res = t. template to_int<int, true, 10, false, false>().value;
@@ -1798,18 +1801,18 @@ void ToIntSimStr10(benchmark::State& state, T t, int c) {
benchmark::DoNotOptimize(res);
benchmark::DoNotOptimize(t);
}
-} | 9.30 | 9.44 | 7.43 | 13.6 | 14.8 | 16.6 | | 9.61 | 9.51 | 8.43 | 13.4 | 14.8 | 16.1 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 libc++ | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-15 | Xeon E5-2682 v4, Windows 10, Clang-22 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-22 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
std::string s = "abcDef"; int res = std::strtol(s.c_str(), 0, 16);void ToIntStr16(benchmark::State& state, const std::string& s, int c) {
+| std::string s = "abcDef"; int res = std::strtol(s.c_str(), 0, 16);void ToIntStr16(benchmark::State& state, const std::string& s, int c) {
for (auto _: state) {
int res = std::strtol(s.c_str(), nullptr, 16);
#ifdef CHECK_RESULT
@@ -1821,8 +1824,8 @@ void ToIntSimStr10(benchmark::State& state, T t, int c) {
benchmark::DoNotOptimize(res);
}
} | >> Всё то же, только для 16ричной системы
-Everything is the same, only for the hexadecimal system | 24.0 | 23.3 | 23.6 | 33.4 | 34.5 | 69.8 | std::string_view s = "abcDef"; std::from_chars(s.data(), s.data() + s.size(), res, 16);void ToIntFromChars16(benchmark::State& state, const std::string_view& s, int c) {
+Everything is the same, only for the hexadecimal system | 24.5 | 24.4 | 23.9 | 33.6 | 35.5 | 67.2 | std::string_view s = "abcDef"; std::from_chars(s.data(), s.data() + s.size(), res, 16);void ToIntFromChars16(benchmark::State& state, const std::string_view& s, int c) {
for (auto _: state) {
int res = 0;
std::from_chars(s.data(), s.data() + s.size(), res, 16);
@@ -1834,8 +1837,8 @@ Everything is the same, only for the hexadecimal system | 9.22 | 21.9 | 8.89 | 8.02 | 8.74 | 19.3 | stringa s = "abcDef"; int res = s.to_int<int, true, 16, false>template<typename T>
+} | 9.59 | 22.0 | 9.15 | 8.50 | 8.96 | 18.3 | stringa s = "abcDef"; int res = s.to_int<int, true, 16, false>template<typename T>
void ToIntSimStr16(benchmark::State& state, T t, int c) {
for (auto _: state) {
int res = t. template to_int<int, true, 16, false, false>().value;
@@ -1848,8 +1851,8 @@ void ToIntSimStr16(benchmark::State& state, T t, int c) {
benchmark::DoNotOptimize(res);
benchmark::DoNotOptimize(t);
}
-} | 7.60 | 7.71 | 15.8 | 12.7 | 14.2 | 20.2 | ssa s = "abcDef"; int res = s.to_int<int, true, 16, false>template<typename T>
+} | 8.04 | 8.28 | 16.2 | 13.7 | 14.5 | 17.2 | ssa s = "abcDef"; int res = s.to_int<int, true, 16, false>template<typename T>
void ToIntSimStr16(benchmark::State& state, T t, int c) {
for (auto _: state) {
int res = t. template to_int<int, true, 16, false, false>().value;
@@ -1862,8 +1865,8 @@ void ToIntSimStr16(benchmark::State& state, T t, int c) {
benchmark::DoNotOptimize(res);
benchmark::DoNotOptimize(t);
}
-} | 7.56 | 7.62 | 6.35 | 7.26 | 13.1 | 20.1 | lstringa<20> s = "abcDef"; int res = s.to_int<int, true, 16, false>template<typename T>
+} | 7.57 | 7.65 | 6.48 | 7.50 | 13.3 | 16.7 | lstringa<20> s = "abcDef"; int res = s.to_int<int, true, 16, false>template<typename T>
void ToIntSimStr16(benchmark::State& state, T t, int c) {
for (auto _: state) {
int res = t. template to_int<int, true, 16, false, false>().value;
@@ -1876,18 +1879,18 @@ void ToIntSimStr16(benchmark::State& state, T t, int c) {
benchmark::DoNotOptimize(res);
benchmark::DoNotOptimize(t);
}
-} | 7.35 | 7.41 | 6.32 | 12.5 | 12.5 | 15.9 | | 7.82 | 7.84 | 6.42 | 12.6 | 12.7 | 16.1 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 libc++ | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-15 | Xeon E5-2682 v4, Windows 10, Clang-22 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-22 | |||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
std::string s = " 123456789"; int res = std::strtol(s.c_str(), 0, 0);void ToIntStr0(benchmark::State& state, const std::string& s, int c) {
+| std::string s = " 123456789"; int res = std::strtol(s.c_str(), 0, 0);void ToIntStr0(benchmark::State& state, const std::string& s, int c) {
for (auto _: state) {
int res = std::strtol(s.c_str(), nullptr, 0);
#ifdef CHECK_RESULT
@@ -1899,8 +1902,8 @@ void ToIntSimStr16(benchmark::State& state, T t, int c) {
benchmark::DoNotOptimize(res);
}
} | >> А здесь уже парсинг произвольного числа.
-And here we have parsing of an arbitrary number. | 29.0 | 28.6 | 28.5 | 43.9 | 45.5 | 98.1 | stringa s = " 123456789"; int res = s.to_int<int>; // Check overflowtemplate<typename T>
+And here we have parsing of an arbitrary number. | 29.2 | 29.4 | 29.1 | 43.6 | 45.6 | 97.3 | stringa s = " 123456789"; int res = s.to_int<int>; // Check overflowtemplate<typename T>
void ToIntSimStr0(benchmark::State& state, T t, int c) {
for (auto _: state) {
int res = t. template to_int<int>().value;
@@ -1913,8 +1916,8 @@ void ToIntSimStr0(benchmark::State& state, T t, int c) {
benchmark::DoNotOptimize(res);
benchmark::DoNotOptimize(t);
}
-} | 11.1 | 11.1 | 22.9 | 18.1 | 22.0 | 13.9 | ssa s = " 123456789"; int res = s.to_int<int, false>; // No check overflowvoid ToIntNoOverflow(benchmark::State& state, ssa t, int c) {
+} | 11.0 | 11.4 | 23.8 | 17.3 | 22.4 | 13.7 | ssa s = " 123456789"; int res = s.to_int<int, false>; // No check overflowvoid ToIntNoOverflow(benchmark::State& state, ssa t, int c) {
for (auto _: state) {
int res = t.to_int<int, false>().value;
#ifdef CHECK_RESULT
@@ -1926,16 +1929,16 @@ void ToIntSimStr0(benchmark::State& state, T t, int c) {
benchmark::DoNotOptimize(res);
benchmark::DoNotOptimize(t);
}
-} | 13.3 | 13.1 | 10.7 | 13.5 | 18.7 | 14.8 | | 13.3 | 13.2 | 11.0 | 12.9 | 19.1 | 15.0 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 libc++ | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-15 | Xeon E5-2682 v4, Windows 10, Clang-22 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-22 | ||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
std::string s = "1234.567e10"; double res = std::strtod(s.c_str(), nullptr);void ToDoubleStr(benchmark::State& state, const std::string& s, double c) {
+| std::string s = "1234.567e10"; double res = std::strtod(s.c_str(), nullptr);void ToDoubleStr(benchmark::State& state, const std::string& s, double c) {
for (auto _: state) {
char* ptr = nullptr;
double res = std::strtod(s.c_str(), &ptr);
@@ -1950,8 +1953,8 @@ void ToIntSimStr0(benchmark::State& state, T t, int c) {
#endif
benchmark::DoNotOptimize(res);
}
-} | 63.6 | 66.6 | 63.5 | 97.1 | 99.9 | 305 | std::string_view s = "1234.567e10"; std::from_chars(s.data(), s.data() + s.size(), res);template<typename K = char>
+} | 66.6 | 65.8 | 66.3 | 100 | 103 | 298 | std::string_view s = "1234.567e10"; std::from_chars(s.data(), s.data() + s.size(), res);template<typename K = char>
void ToDoubleFromChars(benchmark::State& state, const std::string_view& s, double c) {
for (auto _: state) {
double res = 0;
@@ -1970,8 +1973,8 @@ void ToDoubleFromChars(benchmark::State& state, const std::string_view&
#endif
benchmark::DoNotOptimize(res);
}
-} | 24.1 | Not impl | 23.8 | 61.6 | 85.0 | 106 | ssa s = "1234.567e10"; double res = *s.to_double()template<typename T>
+} | 24.5 | Not impl | 24.4 | 58.7 | 82.7 | 108 | ssa s = "1234.567e10"; double res = *s.to_double()template<typename T>
void ToDoubleSimStr(benchmark::State& state, T t, double c) {
for (auto _: state) {
auto r = t.template to_double<false>();
@@ -1988,16 +1991,16 @@ void ToDoubleSimStr(benchmark::State& state, T t, double c) {
benchmark::DoNotOptimize(res);
benchmark::DoNotOptimize(t);
}
-} | 26.0 | 34.2 | 24.2 | 36.6 | 37.0 | 44.4 | | 26.8 | 34.8 | 24.5 | 36.7 | 37.7 | 42.2 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 libc++ | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-15 | Xeon E5-2682 v4, Windows 10, Clang-22 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-22 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
std::stringstream str; ... str << "abbaabbaabbaabba";void AppendStreamConstLiteral(benchmark::State& state) {
+| std::stringstream str; ... str << "abbaabbaabbaabba";void AppendStreamConstLiteral(benchmark::State& state) {
for (auto _: state) {
std::string result;
std::stringstream str;
@@ -2014,8 +2017,8 @@ void ToDoubleSimStr(benchmark::State& state, T t, double c) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(str);
}
-} | 1374 | 1948 | 1379 | 4646 | 5668 | 6891 | std::string str; ... str += "abbaabbaabbaabba";void AppendStdStringConstLiteral(benchmark::State& state) {
+} | 1424 | 2080 | 1411 | 5118 | 5722 | 6499 | std::string str; ... str += "abbaabbaabbaabba";void AppendStdStringConstLiteral(benchmark::State& state) {
for (auto _: state) {
std::string result;
for (size_t c = 0; c < 64; c++) {
@@ -2029,8 +2032,8 @@ void ToDoubleSimStr(benchmark::State& state, T t, double c) {
#endif
benchmark::DoNotOptimize(result);
}
-} | 445 | 419 | 380 | 1060 | 1286 | 853 | lstringa<8> str; ... str += "abbaabbaabbaabba";template<unsigned N>
+} | 445 | 416 | 380 | 1073 | 1306 | 815 | lstringa<8> str; ... str += "abbaabbaabbaabba";template<unsigned N>
void AppendLstringConstLiteral(benchmark::State& state) {
for (auto _: state) {
lstringa<N> result;
@@ -2045,8 +2048,8 @@ void AppendLstringConstLiteral(benchmark::State& state) {
#endif
benchmark::DoNotOptimize(result);
}
-} | 413 | 381 | 360 | 777 | 929 | 805 | lstringa<128> str; ... str += "abbaabbaabbaabba";template<unsigned N>
+} | 388 | 362 | 364 | 767 | 914 | 794 | lstringa<128> str; ... str += "abbaabbaabbaabba";template<unsigned N>
void AppendLstringConstLiteral(benchmark::State& state) {
for (auto _: state) {
lstringa<N> result;
@@ -2064,8 +2067,8 @@ void AppendLstringConstLiteral(benchmark::State& state) {
} | >> Чем больше внутренний буфер, тем меньше раз требуется
аллокация, тем быстрее результат.
The larger the internal buffer, the fewer allocations are
-required, and the faster the result. | 289 | 279 | 263 | 399 | 539 | 594 | lstringa<512> str; ... str += "abbaabbaabbaabba";template<unsigned N>
+required, and the faster the result. | 276 | 245 | 271 | 390 | 542 | 620 | lstringa<512> str; ... str += "abbaabbaabbaabba";template<unsigned N>
void AppendLstringConstLiteral(benchmark::State& state) {
for (auto _: state) {
lstringa<N> result;
@@ -2080,8 +2083,8 @@ void AppendLstringConstLiteral(benchmark::State& state) {
#endif
benchmark::DoNotOptimize(result);
}
-} | 248 | 253 | 219 | 269 | 350 | 462 | lstringa<1024> str; ... str += "abbaabbaabbaabba";template<unsigned N>
+} | 219 | 217 | 229 | 239 | 364 | 401 | lstringa<1024> str; ... str += "abbaabbaabbaabba";template<unsigned N>
void AppendLstringConstLiteral(benchmark::State& state) {
for (auto _: state) {
lstringa<N> result;
@@ -2096,19 +2099,19 @@ void AppendLstringConstLiteral(benchmark::State& state) {
#endif
benchmark::DoNotOptimize(result);
}
-} | 139 | 157 | 143 | 157 | 227 | 366 | | 137 | 136 | 144 | 158 | 230 | 335 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 libc++ | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-15 | Xeon E5-2682 v4, Windows 10, Clang-22 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-22 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
std::stringstream str; ... str << str_var << "abbaabbaabbaabba";void AppendStreamStrConstLiteral(benchmark::State& state) {
+| std::stringstream str; ... str << str_var << "abbaabbaabbaabba";void AppendStreamStrConstLiteral(benchmark::State& state) {
std::string s1 = TEXT_16;
for (auto _: state) {
std::string result;
@@ -2126,8 +2129,8 @@ void AppendLstringConstLiteral(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(s1);
}
-} | 1439 | 1961 | 1348 | 4596 | 5590 | 7083 | std::string str; ... str += str_var + "abbaabbaabbaabba";void AppendStdStrStrConstLiteral(benchmark::State& state) {
+} | 1426 | 2037 | 1391 | 4657 | 5665 | 7163 | std::string str; ... str += str_var + "abbaabbaabbaabba";void AppendStdStrStrConstLiteral(benchmark::State& state) {
std::string p1 = TEXT_16;
for (auto _: state) {
std::string result;
@@ -2143,8 +2146,8 @@ void AppendLstringConstLiteral(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(p1);
}
-} | 1289 | 1263 | 1202 | 3781 | 3966 | 2327 | lstringa<8> str; ... str += str_var + "abbaabbaabbaabba";template<unsigned N>
+} | 1288 | 1253 | 1161 | 3774 | 3902 | 2186 | lstringa<8> str; ... str += str_var + "abbaabbaabbaabba";template<unsigned N>
void AppendLstringStrConstLiteral(benchmark::State& state) {
stringa p1 = TEXT_16;
for (auto _: state) {
@@ -2161,8 +2164,8 @@ void AppendLstringStrConstLiteral(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(p1);
}
-} | 443 | 467 | 456 | 726 | 829 | 1069 | lstringa<128> str; ... str += str_var + "abbaabbaabbaabba";template<unsigned N>
+} | 426 | 401 | 443 | 716 | 822 | 890 | lstringa<128> str; ... str += str_var + "abbaabbaabbaabba";template<unsigned N>
void AppendLstringStrConstLiteral(benchmark::State& state) {
stringa p1 = TEXT_16;
for (auto _: state) {
@@ -2179,8 +2182,8 @@ void AppendLstringStrConstLiteral(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(p1);
}
-} | 383 | 355 | 401 | 465 | 535 | 895 | lstringa<512> str; ... str += str_var + "abbaabbaabbaabba";template<unsigned N>
+} | 340 | 335 | 368 | 442 | 535 | 864 | lstringa<512> str; ... str += str_var + "abbaabbaabbaabba";template<unsigned N>
void AppendLstringStrConstLiteral(benchmark::State& state) {
stringa p1 = TEXT_16;
for (auto _: state) {
@@ -2197,8 +2200,8 @@ void AppendLstringStrConstLiteral(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(p1);
}
-} | 332 | 317 | 310 | 289 | 377 | 800 | lstringa<1024> str; ... str += str_var + "abbaabbaabbaabba";template<unsigned N>
+} | 313 | 291 | 348 | 303 | 377 | 722 | lstringa<1024> str; ... str += str_var + "abbaabbaabbaabba";template<unsigned N>
void AppendLstringStrConstLiteral(benchmark::State& state) {
stringa p1 = TEXT_16;
for (auto _: state) {
@@ -2215,19 +2218,19 @@ void AppendLstringStrConstLiteral(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(p1);
}
-} | 206 | 230 | 212 | 217 | 281 | 713 | | 217 | 214 | 214 | 188 | 286 | 639 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 libc++ | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-15 | Xeon E5-2682 v4, Windows 10, Clang-22 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-22 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
std::stringstream str; ... str << str_var << "abbaabbaabbaabba"; 2048 timesvoid AppendStreamStrConstLiteralBig(benchmark::State& state) {
+| std::stringstream str; ... str << str_var << "abbaabbaabbaabba"; 2048 timesvoid AppendStreamStrConstLiteralBig(benchmark::State& state) {
std::string s1 = TEXT_16;
for (auto _: state) {
std::string result;
@@ -2245,8 +2248,8 @@ void AppendLstringStrConstLiteral(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(s1);
}
-} | 76125 | 140567 | 73026 | 215409 | 287657 | 345299 | std::string str; ... str += str_var + "abbaabbaabbaabba"; 2048 timesvoid AppendStdStrStrConstLiteralBig(benchmark::State& state) {
+} | 75809 | 159733 | 75407 | 221584 | 295560 | 348509 | std::string str; ... str += str_var + "abbaabbaabbaabba"; 2048 timesvoid AppendStdStrStrConstLiteralBig(benchmark::State& state) {
std::string p1 = TEXT_16;
for (auto _: state) {
std::string result;
@@ -2262,8 +2265,8 @@ void AppendLstringStrConstLiteral(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(p1);
}
-} | 71507 | 94630 | 66199 | 193253 | 196942 | 127979 | lstringa<8> str; ... str += str_var + "abbaabbaabbaabba"; 2048 timestemplate<unsigned N>
+} | 73098 | 104710 | 67303 | 183793 | 199734 | 120123 | lstringa<8> str; ... str += str_var + "abbaabbaabbaabba"; 2048 timestemplate<unsigned N>
void AppendLstringStrConstLiteralBig(benchmark::State& state) {
stringa p1 = TEXT_16;
for (auto _: state) {
@@ -2280,8 +2283,8 @@ void AppendLstringStrConstLiteralBig(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(p1);
}
-} | 18029 | 43021 | 22156 | 18926 | 26361 | 52828 | lstringa<128> str; ... str += str_var + "abbaabbaabbaabba"; 2048 timestemplate<unsigned N>
+} | 19767 | 49815 | 20392 | 19687 | 25221 | 44146 | lstringa<128> str; ... str += str_var + "abbaabbaabbaabba"; 2048 timestemplate<unsigned N>
void AppendLstringStrConstLiteralBig(benchmark::State& state) {
stringa p1 = TEXT_16;
for (auto _: state) {
@@ -2298,8 +2301,8 @@ void AppendLstringStrConstLiteralBig(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(p1);
}
-} | 15997 | 23822 | 18805 | 17170 | 23270 | 49507 | lstringa<512> str; ... str += str_var + "abbaabbaabbaabba"; 2048 timestemplate<unsigned N>
+} | 17379 | 27270 | 17950 | 16880 | 23191 | 44572 | lstringa<512> str; ... str += str_var + "abbaabbaabbaabba"; 2048 timestemplate<unsigned N>
void AppendLstringStrConstLiteralBig(benchmark::State& state) {
stringa p1 = TEXT_16;
for (auto _: state) {
@@ -2316,8 +2319,8 @@ void AppendLstringStrConstLiteralBig(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(p1);
}
-} | 15776 | 18156 | 18433 | 15955 | 21890 | 50433 | lstringa<1024> str; ... str += str_var + "abbaabbaabbaabba"; 2048 timestemplate<unsigned N>
+} | 16895 | 16860 | 17908 | 17061 | 21887 | 44298 | lstringa<1024> str; ... str += str_var + "abbaabbaabbaabba"; 2048 timestemplate<unsigned N>
void AppendLstringStrConstLiteralBig(benchmark::State& state) {
stringa p1 = TEXT_16;
for (auto _: state) {
@@ -2334,19 +2337,19 @@ void AppendLstringStrConstLiteralBig(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(p1);
}
-} | 18991 | 17874 | 18781 | 17528 | 22257 | 47948 | | 17082 | 16899 | 17735 | 16444 | 22577 | 44327 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 libc++ | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-15 | Xeon E5-2682 v4, Windows 10, Clang-22 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-22 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
std::stringstream str; ... str << str_var1 << str_var2;void AppendStream2String(benchmark::State& state) {
+| std::stringstream str; ... str << str_var1 << str_var2;void AppendStream2String(benchmark::State& state) {
std::string s1 = TEXT_16;
std::string s2 = TEXT_16;
for (auto _: state) {
@@ -2366,8 +2369,8 @@ void AppendLstringStrConstLiteralBig(benchmark::State& state) {
benchmark::DoNotOptimize(s1);
benchmark::DoNotOptimize(s2);
}
-} | 1364 | 2003 | 1378 | 4397 | 5535 | 7228 | std::string str; ... str += str_var1 + str_var2;void AppendStdStr2String(benchmark::State& state) {
+} | 1469 | 2073 | 1397 | 4403 | 5538 | 7317 | std::string str; ... str += str_var1 + str_var2;void AppendStdStr2String(benchmark::State& state) {
std::string s1 = TEXT_16;
std::string s2 = TEXT_16;
@@ -2386,8 +2389,8 @@ void AppendLstringStrConstLiteralBig(benchmark::State& state) {
benchmark::DoNotOptimize(s1);
benchmark::DoNotOptimize(s2);
}
-} | 1342 | 1370 | 1285 | 3970 | 4014 | 2636 | lstringa<16> str; ... str += str_var1 + str_var2;template<unsigned N>
+} | 1415 | 1492 | 1344 | 3893 | 4019 | 2607 | lstringa<16> str; ... str += str_var1 + str_var2;template<unsigned N>
void AppendLstring2String(benchmark::State& state) {
stra s1 = TEXT_16;
stra s2 = TEXT_16;
@@ -2406,8 +2409,8 @@ void AppendLstring2String(benchmark::State& state) {
benchmark::DoNotOptimize(s1);
benchmark::DoNotOptimize(s2);
}
-} | 523 | 496 | 532 | 812 | 924 | 1283 | lstringa<128> str; ... str += str_var1 + str_var2;template<unsigned N>
+} | 527 | 476 | 547 | 794 | 900 | 1132 | lstringa<128> str; ... str += str_var1 + str_var2;template<unsigned N>
void AppendLstring2String(benchmark::State& state) {
stra s1 = TEXT_16;
stra s2 = TEXT_16;
@@ -2426,8 +2429,8 @@ void AppendLstring2String(benchmark::State& state) {
benchmark::DoNotOptimize(s1);
benchmark::DoNotOptimize(s2);
}
-} | 443 | 434 | 474 | 514 | 607 | 1173 | lstringa<512> str; ... str += str_var1 + str_var2;template<unsigned N>
+} | 465 | 448 | 454 | 527 | 641 | 1062 | lstringa<512> str; ... str += str_var1 + str_var2;template<unsigned N>
void AppendLstring2String(benchmark::State& state) {
stra s1 = TEXT_16;
stra s2 = TEXT_16;
@@ -2446,8 +2449,8 @@ void AppendLstring2String(benchmark::State& state) {
benchmark::DoNotOptimize(s1);
benchmark::DoNotOptimize(s2);
}
-} | 409 | 387 | 379 | 383 | 471 | 1019 | lstringa<1024> str; ... str += str_var1 + str_var2;template<unsigned N>
+} | 408 | 379 | 422 | 381 | 482 | 914 | lstringa<1024> str; ... str += str_var1 + str_var2;template<unsigned N>
void AppendLstring2String(benchmark::State& state) {
stra s1 = TEXT_16;
stra s2 = TEXT_16;
@@ -2466,19 +2469,19 @@ void AppendLstring2String(benchmark::State& state) {
benchmark::DoNotOptimize(s1);
benchmark::DoNotOptimize(s2);
}
-} | 306 | 290 | 281 | 286 | 355 | 906 | | 309 | 298 | 310 | 297 | 365 | 829 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 libc++ | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-15 | Xeon E5-2682 v4, Windows 10, Clang-22 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-22 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
std::stringstream str; str << "test = " << k << " times";void AppendStreamStrNumStr(benchmark::State& state) {
+| std::stringstream str; str << "test = " << k << " times";void AppendStreamStrNumStr(benchmark::State& state) {
for (auto _: state) {
for (unsigned k = 1; k <= 1'000'000'000; k *= 10) {
std::stringstream t;
@@ -2494,8 +2497,8 @@ void AppendLstring2String(benchmark::State& state) {
benchmark::DoNotOptimize(k);
}
}
-} | 3115 | 3322 | 2931 | 10543 | 11311 | 11660 | std::string str = "test = " + std::to_string(k) + " times";void AppendStdStringStrNumStr(benchmark::State& state) {
+} | 3067 | 3419 | 3033 | 10833 | 11725 | 11412 | std::string str = "test = " + std::to_string(k) + " times";void AppendStdStringStrNumStr(benchmark::State& state) {
for (auto _: state) {
for (unsigned k = 1; k <= 1'000'000'000; k *= 10) {
std::string result = "test = " + std::to_string(k) + " times";
@@ -2509,8 +2512,8 @@ void AppendLstring2String(benchmark::State& state) {
benchmark::DoNotOptimize(k);
}
}
-} | 437 | 475 | 412 | 1088 | 1258 | 1723 | char buf[100]; sprintf(buf, "test = %u times", k); std::string str = buf;void AppendSprintfStrNumStr(benchmark::State& state) {
+} | 457 | 474 | 427 | 1053 | 1226 | 1772 | char buf[100]; sprintf(buf, "test = %u times", k); std::string str = buf;void AppendSprintfStrNumStr(benchmark::State& state) {
for (auto _: state) {
for (unsigned k = 1; k <= 1'000'000'000; k *= 10) {
char buf[100];
@@ -2526,8 +2529,8 @@ void AppendLstring2String(benchmark::State& state) {
benchmark::DoNotOptimize(k);
}
}
-} | 1382 | 1200 | 1435 | 2743 | 2797 | 5394 | std::string str = std::format("test = {} times", k);void AppendFormatStrNumStr(benchmark::State& state) {
+} | 1393 | 1229 | 1487 | 2810 | 2815 | 5285 | std::string str = std::format("test = {} times", k);void AppendFormatStrNumStr(benchmark::State& state) {
for (auto _: state) {
for (unsigned k = 1; k <= 1'000'000'000; k *= 10) {
std::string result = std::format("test = {} times", k);
@@ -2541,8 +2544,8 @@ void AppendLstring2String(benchmark::State& state) {
benchmark::DoNotOptimize(k);
}
}
-} | 1121 | 948 | 1165 | 1919 | 2370 | 2892 | lstringa<8> str; str.format("test = {} times", k);template<typename T>
+} | 1140 | 959 | 1206 | 1904 | 2391 | 2834 | lstringa<8> str; str.format("test = {} times", k);template<typename T>
void AppendSimStrStrNumStrF(benchmark::State& state) {
for (auto _: state) {
for (unsigned k = 1; k <= 1'000'000'000; k *= 10) {
@@ -2560,8 +2563,8 @@ void AppendSimStrStrNumStrF(benchmark::State& state) {
}
} | >> В simstr format с первого раза не помещается в такую строку без аллокации.
In simstr format, the first time it doesn't fit into such a
-string without allocation. | 1269 | 2019 | 1487 | 1972 | 2624 | 4873 | lstringa<32> str; str.format("test = {} times", k);template<typename T>
+string without allocation. | 1356 | 2002 | 1559 | 2003 | 2677 | 4681 | lstringa<32> str; str.format("test = {} times", k);template<typename T>
void AppendSimStrStrNumStrF(benchmark::State& state) {
for (auto _: state) {
for (unsigned k = 1; k <= 1'000'000'000; k *= 10) {
@@ -2578,8 +2581,8 @@ void AppendSimStrStrNumStrF(benchmark::State& state) {
}
}
} | >> А в такую помещается. Используйте сразу буфера подходящего размера.
-And it fits in this one. Use buffers of the appropriate size right away. | 967 | 1714 | 1005 | 993 | 1513 | 4141 | lstringa<8> str = "test = " + k + " times";template<typename T>
+And it fits in this one. Use buffers of the appropriate size right away. | 1002 | 1745 | 1054 | 962 | 1480 | 4054 | lstringa<8> str = "test = " + k + " times";template<typename T>
void AppendSimStrStrNumStr(benchmark::State& state) {
for (auto _: state) {
for (unsigned k = 1; k <= 1'000'000'000; k *= 10) {
@@ -2595,8 +2598,8 @@ void AppendSimStrStrNumStr(benchmark::State& state) {
}
}
} | >> Результат не помещается в SSO, возникает аллокация.
-The result does not fit into SSO, an allocation occurs. | 278 | 271 | 289 | 810 | 877 | 611 | lstringa<32> str = "test = " + k + " times";template<typename T>
+The result does not fit into SSO, an allocation occurs. | 262 | 263 | 290 | 807 | 890 | 555 | lstringa<32> str = "test = " + k + " times";template<typename T>
void AppendSimStrStrNumStr(benchmark::State& state) {
for (auto _: state) {
for (unsigned k = 1; k <= 1'000'000'000; k *= 10) {
@@ -2614,8 +2617,8 @@ void AppendSimStrStrNumStr(benchmark::State& state) {
} | >> А здесь и ниже - результат укладывается в SSO.
Ещё раз - используйте сразу буфера подходящего размера.
And here and below, the result fits within SSO.
-Once again, use appropriately sized buffers from the start. | 120 | 120 | 132 | 129 | 171 | 374 | stringa str = "test = " + k + " times";template<typename T>
+Once again, use appropriately sized buffers from the start. | 126 | 119 | 136 | 134 | 180 | 339 | stringa str = "test = " + k + " times";template<typename T>
void AppendSimStrStrNumStr(benchmark::State& state) {
for (auto _: state) {
for (unsigned k = 1; k <= 1'000'000'000; k *= 10) {
@@ -2633,22 +2636,22 @@ void AppendSimStrStrNumStr(benchmark::State& state) {
} | >> Под WASM размер SSO 15 символов, что явно не хватает для размещения
результата, отсюда и такое время.
Under WASM, the SSO size is 15 characters, which is clearly not
-enough to accommodate the result, hence the long time. | 121 | 124 | 136 | 118 | 172 | 554 | | 124 | 118 | 137 | 126 | 172 | 511 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 libc++ | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-15 | Xeon E5-2682 v4, Windows 10, Clang-22 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-22 | |||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
std::string::find + substr + std::strtolvoid SplitConvertIntStdString(benchmark::State& state) {
+| std::string::find + substr + std::strtolvoid SplitConvertIntStdString(benchmark::State& state) {
std::string numbers = NUMBER_LIST;
for (auto _: state) {
int total = 0;
@@ -2670,8 +2673,8 @@ enough to accommodate the result, hence the long time. | 291 | 277 | 272 | 547 | 555 | 684 | ssa::splitter + ssa::as_intvoid SplitConvertIntSimStr(benchmark::State& state) {
+} | 270 | 277 | 275 | 558 | 573 | 660 | ssa::splitter + ssa::as_intvoid SplitConvertIntSimStr(benchmark::State& state) {
stra numbers = NUMBER_LIST;
for (auto _: state) {
int total = 0;
@@ -2687,8 +2690,8 @@ enough to accommodate the result, hence the long time. | 159 | 153 | 190 | 167 | 306 | 247 | ssa::splitf + functorvoid SplitConvertIntSplitf(benchmark::State& state) {
+} | 156 | 159 | 192 | 176 | 304 | 245 | ssa::splitf + functorvoid SplitConvertIntSplitf(benchmark::State& state) {
stra numbers = NUMBER_LIST;
for (auto _: state) {
int total = 0;
@@ -2702,16 +2705,16 @@ enough to accommodate the result, hence the long time. | 201 | 211 | 194 | 194 | 212 | 284 | | 207 | 213 | 196 | 192 | 218 | 271 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 libc++ | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-15 | Xeon E5-2682 v4, Windows 10, Clang-22 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-22 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Naive (and wrong) replace symbols with std::string find + replacevoid ReplaceSymbolsStdStringNaiveWrong(benchmark::State& state) {
+| Naive (and wrong) replace symbols with std::string find + replacevoid ReplaceSymbolsStdStringNaiveWrong(benchmark::State& state) {
std::string_view source =
"abcdefg124 < jhsfjsh sjdfsh jfhjd && jdjdj >"
" ksjd-fksjd \"dkjfs-jkhdf dfj ' kdkd \"dkfdkfkdjf"
@@ -2768,8 +2771,8 @@ enough to accommodate the result, hence the long time. | 'b' and 'b'->'a'. But if the substitutions don't conflict,
-it works quickly. | 826 | 892 | 793 | 1076 | 1249 | 2994 | replace symbols with std::string find_first_of + replacevoid ReplaceSymbolsStdStringNaiveRight(benchmark::State& state) {
+it works quickly. | 844 | 916 | 822 | 1124 | 1206 | 2872 | replace symbols with std::string find_first_of + replacevoid ReplaceSymbolsStdStringNaiveRight(benchmark::State& state) {
std::string_view source =
"abcdefg124 < jhsfjsh sjdfsh jfhjd && jdjdj >"
" ksjd-fksjd \"dkjfs-jkhdf dfj ' kdkd \"dkfdkfkdjf"
@@ -2823,8 +2826,8 @@ it works quickly. | 826 | >> Дальше уже правильные реализации, не зависящие от конфликтующих замен.
Further, there are correct implementations that do not depend on
-conflicting replacements. | 2450 | 2193 | 2390 | 1899 | 2111 | 5651 | replace symbols with std::string_view find_first_of + copyvoid ReplaceSymbolsStdString(benchmark::State& state) {
+conflicting replacements. | 2647 | 2428 | 2428 | 1940 | 2200 | 5223 | replace symbols with std::string_view find_first_of + copyvoid ReplaceSymbolsStdString(benchmark::State& state) {
std::string_view source =
"abcdefg124 < jhsfjsh sjdfsh jfhjd && jdjdj >"
" ksjd-fksjd \"dkjfs-jkhdf dfj ' kdkd \"dkfdkfkdjf"
@@ -2875,8 +2878,8 @@ conflicting replacements. | 2450 | 1073 | 1024 | 960 | 2272 | 2522 | 2910 | replace runtime symbols with string expressions and without remembering all search resultstemplate<bool UseVector>
+} | 1123 | 1026 | 1065 | 2359 | 2544 | 2704 | replace runtime symbols with string expressions and without remembering all search resultstemplate<bool UseVector>
void ReplaceSymbolsDynPatternSimStr(benchmark::State& state) {
stra source =
"abcdefg124 < jhsfjsh sjdfsh jfhjd && jdjdj >"
@@ -2921,8 +2924,8 @@ void ReplaceSymbolsDynPatternSimStr(benchmark::State& state) {
benchmark::DoNotOptimize(source);
benchmark::DoNotOptimize(repl);
}
-} | 1247 | 1463 | 1320 | 1591 | 1682 | 2879 | replace runtime symbols with simstr and memorization of all search resultstemplate<bool UseVector>
+} | 1273 | 1408 | 1372 | 1654 | 1663 | 2675 | replace runtime symbols with simstr and memorization of all search resultstemplate<bool UseVector>
void ReplaceSymbolsDynPatternSimStr(benchmark::State& state) {
stra source =
"abcdefg124 < jhsfjsh sjdfsh jfhjd && jdjdj >"
@@ -2967,8 +2970,8 @@ void ReplaceSymbolsDynPatternSimStr(benchmark::State& state) {
benchmark::DoNotOptimize(source);
benchmark::DoNotOptimize(repl);
}
-} | 959 | 1131 | 1012 | 1349 | 1470 | 2251 | replace const symbols with string expressions and without remembering all search resultstemplate<bool UseVector>
+} | 1067 | 1083 | 1016 | 1483 | 1442 | 2107 | replace const symbols with string expressions and without remembering all search resultstemplate<bool UseVector>
void ReplaceSymbolsCons2PatternSimStr(benchmark::State& state) {
stra source =
"abcdefg124 < jhsfjsh sjdfsh jfhjd && jdjdj >"
@@ -3010,8 +3013,8 @@ void ReplaceSymbolsCons2PatternSimStr(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 1104 | 1003 | 1057 | 1129 | 1271 | 2457 | replace const symbols with string expressions and memorization of all search resultstemplate<bool UseVector>
+} | 1029 | 1128 | 1045 | 1122 | 1293 | 2227 | replace const symbols with string expressions and memorization of all search resultstemplate<bool UseVector>
void ReplaceSymbolsCons2PatternSimStr(benchmark::State& state) {
stra source =
"abcdefg124 < jhsfjsh sjdfsh jfhjd && jdjdj >"
@@ -3053,20 +3056,20 @@ void ReplaceSymbolsCons2PatternSimStr(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 804 | 876 | 827 | 1182 | 1209 | 2073 | | 887 | 820 | 837 | 1170 | 1213 | 1872 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 libc++ | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-15 | Xeon E5-2682 v4, Windows 10, Clang-22 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-22 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Short Naive (and wrong) replace symbols with std::string find + replacevoid ShortReplaceSymbolsStdStringNaiveWrong(benchmark::State& state) {
+| Short Naive (and wrong) replace symbols with std::string find + replacevoid ShortReplaceSymbolsStdStringNaiveWrong(benchmark::State& state) {
std::string_view source =
"abcdefg124 < jhsfjsh sjdfsh jfhjd && jdjdj >"
;
@@ -3104,8 +3107,8 @@ void ReplaceSymbolsCons2PatternSimStr(benchmark::State& state) {
benchmark::DoNotOptimize(source);
benchmark::DoNotOptimize(repl);
}
-} | 158 | 167 | 157 | 299 | 327 | 498 | Short replace symbols with std::string find_first_of + replacevoid ShortReplaceSymbolsStdStringNaiveRight(benchmark::State& state) {
+} | 166 | 177 | 161 | 308 | 328 | 472 | Short replace symbols with std::string find_first_of + replacevoid ShortReplaceSymbolsStdStringNaiveRight(benchmark::State& state) {
std::string_view source =
"abcdefg124 < jhsfjsh sjdfsh jfhjd && jdjdj >"
;
@@ -3143,8 +3146,8 @@ void ReplaceSymbolsCons2PatternSimStr(benchmark::State& state) {
benchmark::DoNotOptimize(source);
benchmark::DoNotOptimize(repl);
}
-} | 311 | 309 | 318 | 346 | 407 | 751 | Short replace symbols with std::string_view find_first_of + copyvoid ShortReplaceSymbolsStdString(benchmark::State& state) {
+} | 334 | 324 | 329 | 364 | 420 | 718 | Short replace symbols with std::string_view find_first_of + copyvoid ShortReplaceSymbolsStdString(benchmark::State& state) {
std::string_view source =
"abcdefg124 < jhsfjsh sjdfsh jfhjd && jdjdj >"
;
@@ -3181,8 +3184,8 @@ void ReplaceSymbolsCons2PatternSimStr(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 154 | 152 | 150 | 296 | 339 | 448 | Short replace runtime symbols with string expressions and without remembering all search resultstemplate<bool UseVector>
+} | 154 | 141 | 154 | 305 | 333 | 433 | Short replace runtime symbols with string expressions and without remembering all search resultstemplate<bool UseVector>
void ShortReplaceSymbolsDynPatternSimStr(benchmark::State& state) {
stra source =
"abcdefg124 < jhsfjsh sjdfsh jfhjd && jdjdj >"
@@ -3213,8 +3216,8 @@ void ShortReplaceSymbolsDynPatternSimStr(benchmark::State& state) {
benchmark::DoNotOptimize(source);
benchmark::DoNotOptimize(repl);
}
-} | 166 | 192 | 175 | 266 | 309 | 392 | Short replace runtime symbols with simstr and memorization of all search resultstemplate<bool UseVector>
+} | 169 | 198 | 180 | 269 | 310 | 378 | Short replace runtime symbols with simstr and memorization of all search resultstemplate<bool UseVector>
void ShortReplaceSymbolsDynPatternSimStr(benchmark::State& state) {
stra source =
"abcdefg124 < jhsfjsh sjdfsh jfhjd && jdjdj >"
@@ -3245,8 +3248,8 @@ void ShortReplaceSymbolsDynPatternSimStr(benchmark::State& state) {
benchmark::DoNotOptimize(source);
benchmark::DoNotOptimize(repl);
}
-} | 174 | 208 | 178 | 357 | 387 | 421 | Short replace const symbols with string expressions and without remembering all search resultstemplate<bool UseVector>
+} | 201 | 186 | 184 | 366 | 401 | 391 | Short replace const symbols with string expressions and without remembering all search resultstemplate<bool UseVector>
void ShortReplaceSymbolsCons2PatternSimStr(benchmark::State& state) {
stra source =
"abcdefg124 < jhsfjsh sjdfsh jfhjd && jdjdj >"
@@ -3274,8 +3277,8 @@ void ShortReplaceSymbolsCons2PatternSimStr(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 127 | 124 | 136 | 198 | 250 | 278 | Short replace const symbols with string expressions and memorization of all search resultstemplate<bool UseVector>
+} | 130 | 126 | 139 | 202 | 254 | 271 | Short replace const symbols with string expressions and memorization of all search resultstemplate<bool UseVector>
void ShortReplaceSymbolsCons2PatternSimStr(benchmark::State& state) {
stra source =
"abcdefg124 < jhsfjsh sjdfsh jfhjd && jdjdj >"
@@ -3303,20 +3306,20 @@ void ShortReplaceSymbolsCons2PatternSimStr(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 138 | 137 | 129 | 297 | 363 | 317 | | 145 | 136 | 132 | 293 | 334 | 294 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 libc++ | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-15 | Xeon E5-2682 v4, Windows 10, Clang-22 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-22 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
replace bb to ---- in std::string|64template<size_t Long>
+| replace bb to ---- in std::string|64template<size_t Long>
void ReplaceAllLongerStdString(benchmark::State& state) {
std::string_view source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
std::string_view sample = "aaaaaaaaaaaaaaaaaaa----baaaaaaaa--------aaaaabaaaaaaaaaaaaaaaaaaaaa----a";
@@ -3348,8 +3351,8 @@ void ReplaceAllLongerStdString(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | 152 | 173 | 154 | 221 | 239 | 370 | replace bb to ---- in std::string|256template<size_t Long>
+} | 151 | 180 | 154 | 223 | 242 | 363 | replace bb to ---- in std::string|256template<size_t Long>
void ReplaceAllLongerStdString(benchmark::State& state) {
std::string_view source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
std::string_view sample = "aaaaaaaaaaaaaaaaaaa----baaaaaaaa--------aaaaabaaaaaaaaaaaaaaaaaaaaa----a";
@@ -3381,8 +3384,8 @@ void ReplaceAllLongerStdString(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | 525 | 844 | 500 | 737 | 755 | 1187 | replace bb to ---- in std::string|512template<size_t Long>
+} | 603 | 842 | 504 | 727 | 791 | 1189 | replace bb to ---- in std::string|512template<size_t Long>
void ReplaceAllLongerStdString(benchmark::State& state) {
std::string_view source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
std::string_view sample = "aaaaaaaaaaaaaaaaaaa----baaaaaaaa--------aaaaabaaaaaaaaaaaaaaaaaaaaa----a";
@@ -3414,8 +3417,8 @@ void ReplaceAllLongerStdString(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | 1078 | 1199 | 972 | 1364 | 1467 | 2268 | replace bb to ---- in std::string|1024template<size_t Long>
+} | 1060 | 1259 | 1000 | 1418 | 1464 | 2210 | replace bb to ---- in std::string|1024template<size_t Long>
void ReplaceAllLongerStdString(benchmark::State& state) {
std::string_view source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
std::string_view sample = "aaaaaaaaaaaaaaaaaaa----baaaaaaaa--------aaaaabaaaaaaaaaaaaaaaaaaaaa----a";
@@ -3447,8 +3450,8 @@ void ReplaceAllLongerStdString(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | 2264 | 2462 | 2261 | 3034 | 3081 | 4800 | replace bb to ---- in std::string|2048template<size_t Long>
+} | 2332 | 2422 | 2347 | 3058 | 3204 | 4756 | replace bb to ---- in std::string|2048template<size_t Long>
void ReplaceAllLongerStdString(benchmark::State& state) {
std::string_view source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
std::string_view sample = "aaaaaaaaaaaaaaaaaaa----baaaaaaaa--------aaaaabaaaaaaaaaaaaaaaaaaaaa----a";
@@ -3480,8 +3483,8 @@ void ReplaceAllLongerStdString(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | 5910 | 6298 | 5887 | 7577 | 7858 | 10945 | replace bb to ---- in lstringa<8>|64template<size_t N, size_t Count>
+} | 5851 | 6347 | 5969 | 8038 | 8080 | 11109 | replace bb to ---- in lstringa<8>|64template<size_t N, size_t Count>
void ReplaceAllLongerSimString(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
ssa sample = "aaaaaaaaaaaaaaaaaaa----baaaaaaaa--------aaaaabaaaaaaaaaaaaaaaaaaaaa----a";
@@ -3502,8 +3505,8 @@ void ReplaceAllLongerSimString(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 127 | 129 | 130 | 214 | 231 | 285 | replace bb to ---- in lstringa<8>|256template<size_t N, size_t Count>
+} | 127 | 129 | 138 | 216 | 225 | 292 | replace bb to ---- in lstringa<8>|256template<size_t N, size_t Count>
void ReplaceAllLongerSimString(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
ssa sample = "aaaaaaaaaaaaaaaaaaa----baaaaaaaa--------aaaaabaaaaaaaaaaaaaaaaaaaaa----a";
@@ -3524,8 +3527,8 @@ void ReplaceAllLongerSimString(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 425 | 446 | 494 | 601 | 653 | 910 | replace bb to ---- in lstringa<8>|512template<size_t N, size_t Count>
+} | 442 | 444 | 444 | 606 | 655 | 913 | replace bb to ---- in lstringa<8>|512template<size_t N, size_t Count>
void ReplaceAllLongerSimString(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
ssa sample = "aaaaaaaaaaaaaaaaaaa----baaaaaaaa--------aaaaabaaaaaaaaaaaaaaaaaaaaa----a";
@@ -3546,8 +3549,8 @@ void ReplaceAllLongerSimString(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 801 | 831 | 839 | 1009 | 1115 | 1712 | replace bb to ---- in lstringa<8>|1024template<size_t N, size_t Count>
+} | 831 | 828 | 899 | 1002 | 1124 | 1685 | replace bb to ---- in lstringa<8>|1024template<size_t N, size_t Count>
void ReplaceAllLongerSimString(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
ssa sample = "aaaaaaaaaaaaaaaaaaa----baaaaaaaa--------aaaaabaaaaaaaaaaaaaaaaaaaaa----a";
@@ -3568,8 +3571,8 @@ void ReplaceAllLongerSimString(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 1639 | 1609 | 1731 | 1851 | 2048 | 3116 | replace bb to ---- in lstringa<8>|2048template<size_t N, size_t Count>
+} | 1698 | 1614 | 1751 | 1848 | 2038 | 3100 | replace bb to ---- in lstringa<8>|2048template<size_t N, size_t Count>
void ReplaceAllLongerSimString(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
ssa sample = "aaaaaaaaaaaaaaaaaaa----baaaaaaaa--------aaaaabaaaaaaaaaaaaaaaaaaaaa----a";
@@ -3590,8 +3593,8 @@ void ReplaceAllLongerSimString(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 3077 | 3058 | 3350 | 3468 | 3807 | 6042 | replace bb to ---- by init stringa|64template<size_t Count>
+} | 3256 | 3127 | 3301 | 3556 | 3964 | 6119 | replace bb to ---- by init stringa|64template<size_t Count>
void ReplaceAllLongerSimStringExpr(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
ssa sample = "aaaaaaaaaaaaaaaaaaa----baaaaaaaa--------aaaaabaaaaaaaaaaaaaaaaaaaaa----a";
@@ -3611,8 +3614,8 @@ void ReplaceAllLongerSimStringExpr(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 92.5 | 89.4 | 82.3 | 161 | 197 | 170 | replace bb to ---- by init stringa|256template<size_t Count>
+} | 91.5 | 90.9 | 92.8 | 165 | 196 | 187 | replace bb to ---- by init stringa|256template<size_t Count>
void ReplaceAllLongerSimStringExpr(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
ssa sample = "aaaaaaaaaaaaaaaaaaa----baaaaaaaa--------aaaaabaaaaaaaaaaaaaaaaaaaaa----a";
@@ -3632,8 +3635,8 @@ void ReplaceAllLongerSimStringExpr(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 293 | 283 | 276 | 362 | 448 | 586 | replace bb to ---- by init stringa|512template<size_t Count>
+} | 306 | 308 | 287 | 366 | 456 | 580 | replace bb to ---- by init stringa|512template<size_t Count>
void ReplaceAllLongerSimStringExpr(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
ssa sample = "aaaaaaaaaaaaaaaaaaa----baaaaaaaa--------aaaaabaaaaaaaaaaaaaaaaaaaaa----a";
@@ -3653,8 +3656,8 @@ void ReplaceAllLongerSimStringExpr(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 687 | 673 | 675 | 773 | 1049 | 1275 | replace bb to ---- by init stringa|1024template<size_t Count>
+} | 718 | 709 | 705 | 793 | 1064 | 1341 | replace bb to ---- by init stringa|1024template<size_t Count>
void ReplaceAllLongerSimStringExpr(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
ssa sample = "aaaaaaaaaaaaaaaaaaa----baaaaaaaa--------aaaaabaaaaaaaaaaaaaaaaaaaaa----a";
@@ -3674,8 +3677,8 @@ void ReplaceAllLongerSimStringExpr(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 1581 | 1432 | 1510 | 1575 | 2172 | 2632 | replace bb to ---- by init stringa|2048template<size_t Count>
+} | 1629 | 1392 | 1550 | 1626 | 2161 | 2813 | replace bb to ---- by init stringa|2048template<size_t Count>
void ReplaceAllLongerSimStringExpr(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
ssa sample = "aaaaaaaaaaaaaaaaaaa----baaaaaaaa--------aaaaabaaaaaaaaaaaaaaaaaaaaa----a";
@@ -3695,28 +3698,28 @@ void ReplaceAllLongerSimStringExpr(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 3167 | 2854 | 3059 | 2876 | 4373 | 5701 | | 3400 | 2810 | 3106 | 3047 | 4481 | 5550 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 libc++ | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-15 | Xeon E5-2682 v4, Windows 10, Clang-22 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-22 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
replace bb to -- in std::string|64template<size_t Long>
+| replace bb to -- in std::string|64template<size_t Long>
void ReplaceAllEqualStdString(benchmark::State& state) {
std::string_view source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
std::string_view sample = "aaaaaaaaaaaaaaaaaaa--baaaaaaaa----aaaaabaaaaaaaaaaaaaaaaaaaaa--a";
@@ -3747,8 +3750,8 @@ void ReplaceAllEqualStdString(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | 112 | 118 | 120 | 178 | 196 | 264 | replace bb to -- in std::string|256template<size_t Long>
+} | 114 | 130 | 131 | 187 | 198 | 243 | replace bb to -- in std::string|256template<size_t Long>
void ReplaceAllEqualStdString(benchmark::State& state) {
std::string_view source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
std::string_view sample = "aaaaaaaaaaaaaaaaaaa--baaaaaaaa----aaaaabaaaaaaaaaaaaaaaaaaaaa--a";
@@ -3779,8 +3782,8 @@ void ReplaceAllEqualStdString(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | 376 | 413 | 365 | 459 | 503 | 846 | replace bb to -- in std::string|512template<size_t Long>
+} | 390 | 427 | 381 | 469 | 520 | 814 | replace bb to -- in std::string|512template<size_t Long>
void ReplaceAllEqualStdString(benchmark::State& state) {
std::string_view source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
std::string_view sample = "aaaaaaaaaaaaaaaaaaa--baaaaaaaa----aaaaabaaaaaaaaaaaaaaaaaaaaa--a";
@@ -3811,8 +3814,8 @@ void ReplaceAllEqualStdString(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | 720 | 825 | 772 | 828 | 898 | 1556 | replace bb to -- in std::string|1024template<size_t Long>
+} | 743 | 851 | 743 | 837 | 928 | 1542 | replace bb to -- in std::string|1024template<size_t Long>
void ReplaceAllEqualStdString(benchmark::State& state) {
std::string_view source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
std::string_view sample = "aaaaaaaaaaaaaaaaaaa--baaaaaaaa----aaaaabaaaaaaaaaaaaaaaaaaaaa--a";
@@ -3843,8 +3846,8 @@ void ReplaceAllEqualStdString(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | 1438 | 1543 | 1404 | 1549 | 1731 | 2961 | replace bb to -- in std::string|2048template<size_t Long>
+} | 1477 | 1603 | 1483 | 1612 | 1750 | 2825 | replace bb to -- in std::string|2048template<size_t Long>
void ReplaceAllEqualStdString(benchmark::State& state) {
std::string_view source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
std::string_view sample = "aaaaaaaaaaaaaaaaaaa--baaaaaaaa----aaaaabaaaaaaaaaaaaaaaaaaaaa--a";
@@ -3875,8 +3878,8 @@ void ReplaceAllEqualStdString(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | 2839 | 3140 | 2726 | 3072 | 3433 | 5794 | replace bb to -- in lstringa<8>|64template<size_t N, size_t Long>
+} | 2929 | 3230 | 2798 | 3131 | 3402 | 5545 | replace bb to -- in lstringa<8>|64template<size_t N, size_t Long>
void ReplaceAllEqualSimString(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
ssa sample = "aaaaaaaaaaaaaaaaaaa--baaaaaaaa----aaaaabaaaaaaaaaaaaaaaaaaaaa--a";
@@ -3896,8 +3899,8 @@ void ReplaceAllEqualSimString(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 93.2 | 88.1 | 90.0 | 173 | 185 | 198 | replace bb to -- in lstringa<8>|256template<size_t N, size_t Long>
+} | 89.2 | 90.8 | 91.5 | 175 | 186 | 192 | replace bb to -- in lstringa<8>|256template<size_t N, size_t Long>
void ReplaceAllEqualSimString(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
ssa sample = "aaaaaaaaaaaaaaaaaaa--baaaaaaaa----aaaaabaaaaaaaaaaaaaaaaaaaaa--a";
@@ -3917,8 +3920,8 @@ void ReplaceAllEqualSimString(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 297 | 282 | 295 | 426 | 442 | 663 | replace bb to -- in lstringa<8>|512template<size_t N, size_t Long>
+} | 295 | 294 | 302 | 427 | 442 | 636 | replace bb to -- in lstringa<8>|512template<size_t N, size_t Long>
void ReplaceAllEqualSimString(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
ssa sample = "aaaaaaaaaaaaaaaaaaa--baaaaaaaa----aaaaabaaaaaaaaaaaaaaaaaaaaa--a";
@@ -3938,8 +3941,8 @@ void ReplaceAllEqualSimString(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 519 | 526 | 540 | 727 | 765 | 1186 | replace bb to -- in lstringa<8>|1024template<size_t N, size_t Long>
+} | 553 | 551 | 539 | 723 | 771 | 1150 | replace bb to -- in lstringa<8>|1024template<size_t N, size_t Long>
void ReplaceAllEqualSimString(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
ssa sample = "aaaaaaaaaaaaaaaaaaa--baaaaaaaa----aaaaabaaaaaaaaaaaaaaaaaaaaa--a";
@@ -3959,8 +3962,8 @@ void ReplaceAllEqualSimString(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 1081 | 1072 | 1086 | 1381 | 1447 | 2250 | replace bb to -- in lstringa<8>|2048template<size_t N, size_t Long>
+} | 1122 | 1066 | 1121 | 1373 | 1457 | 2296 | replace bb to -- in lstringa<8>|2048template<size_t N, size_t Long>
void ReplaceAllEqualSimString(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
ssa sample = "aaaaaaaaaaaaaaaaaaa--baaaaaaaa----aaaaabaaaaaaaaaaaaaaaaaaaaa--a";
@@ -3980,8 +3983,8 @@ void ReplaceAllEqualSimString(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 2117 | 2023 | 2111 | 2653 | 2826 | 4373 | replace bb to -- by init stringa|64template<size_t Count>
+} | 2088 | 2242 | 2174 | 2685 | 2800 | 4237 | replace bb to -- by init stringa|64template<size_t Count>
void ReplaceAllEqualSimStringExpr(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
ssa sample = "aaaaaaaaaaaaaaaaaaa--baaaaaaaa----aaaaabaaaaaaaaaaaaaaaaaaaaa--a";
@@ -4005,8 +4008,8 @@ void ReplaceAllEqualSimStringExpr(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | 75.5 | 75.3 | 75.9 | 150 | 163 | 144 | replace bb to -- by init stringa|256template<size_t Count>
+} | 73.9 | 83.0 | 112 | 153 | 165 | 136 | replace bb to -- by init stringa|256template<size_t Count>
void ReplaceAllEqualSimStringExpr(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
ssa sample = "aaaaaaaaaaaaaaaaaaa--baaaaaaaa----aaaaabaaaaaaaaaaaaaaaaaaaaa--a";
@@ -4030,8 +4033,8 @@ void ReplaceAllEqualSimStringExpr(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | 243 | 233 | 241 | 329 | 373 | 472 | replace bb to -- by init stringa|512template<size_t Count>
+} | 240 | 237 | 262 | 322 | 367 | 464 | replace bb to -- by init stringa|512template<size_t Count>
void ReplaceAllEqualSimStringExpr(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
ssa sample = "aaaaaaaaaaaaaaaaaaa--baaaaaaaa----aaaaabaaaaaaaaaaaaaaaaaaaaa--a";
@@ -4055,8 +4058,8 @@ void ReplaceAllEqualSimStringExpr(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | 429 | 428 | 457 | 519 | 620 | 894 | replace bb to -- by init stringa|1024template<size_t Count>
+} | 434 | 435 | 479 | 520 | 632 | 838 | replace bb to -- by init stringa|1024template<size_t Count>
void ReplaceAllEqualSimStringExpr(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
ssa sample = "aaaaaaaaaaaaaaaaaaa--baaaaaaaa----aaaaabaaaaaaaaaaaaaaaaaaaaa--a";
@@ -4080,8 +4083,8 @@ void ReplaceAllEqualSimStringExpr(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | 909 | 846 | 920 | 987 | 1101 | 1701 | replace bb to -- by init stringa|2048template<size_t Count>
+} | 898 | 851 | 954 | 954 | 1108 | 1620 | replace bb to -- by init stringa|2048template<size_t Count>
void ReplaceAllEqualSimStringExpr(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
ssa sample = "aaaaaaaaaaaaaaaaaaa--baaaaaaaa----aaaaabaaaaaaaaaaaaaaaaaaaaa--a";
@@ -4105,28 +4108,28 @@ void ReplaceAllEqualSimStringExpr(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | 1687 | 1654 | 1760 | 1744 | 2114 | 2793 | | 1709 | 1658 | 1809 | 1806 | 2118 | 2774 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 libc++ | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-15 | Xeon E5-2682 v4, Windows 10, Clang-22 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-22 | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
hashStrMapA<size_t> emplace & find stringa;void HashMapSimStr(benchmark::State& state) {
+| hashStrMapA<size_t> emplace & find stringa;void HashMapSimStr(benchmark::State& state) {
for (auto _: state) {
hashStrMapA<size_t> store;
for (size_t idx = 0; idx < bs_sim.size(); idx++) {
@@ -4151,8 +4154,8 @@ void ReplaceAllEqualSimStringExpr(benchmark::State& state) {
} | >> Вставляем в hashStrMapA 10000 stringa длиной от 30 до 50
символов, а потом ищем их в ней
We insert 10,000 strings of length from 30 to 50 characters into
-hashStrMapA, and then search for them in it. | 3719139 | 3677557 | 3672616 | 3865656 | 4373144 | 3509082 | std::unordered_map<std::string, size_t> emplace & find std::string;void HashMapStdStr(benchmark::State& state) {
+hashStrMapA, and then search for them in it. | 3754473 | 3780026 | 3843202 | 4069702 | 4479657 | 3271665 | std::unordered_map<std::string, size_t> emplace & find std::string;void HashMapStdStr(benchmark::State& state) {
for (auto _: state) {
std::unordered_map<std::string, size_t> store;
for (size_t idx = 0; idx < bs_std.size(); idx++) {
@@ -4175,8 +4178,8 @@ hashStrMapA, and then search for them in it. | >> То же самое c std::string и std::unordered_map
-Same thing with std::string and std::unordered_map | 3546099 | 3517210 | 3585692 | 5706555 | 5795906 | 3684923 | hashStrMapA<size_t> emplace & find ssa;void HashMapSimSsa(benchmark::State& state) {
+Same thing with std::string and std::unordered_map | 3584569 | 3706958 | 3689411 | 5913523 | 6065832 | 3592775 | hashStrMapA<size_t> emplace & find ssa;void HashMapSimSsa(benchmark::State& state) {
for (auto _: state) {
hashStrMapA<size_t> store;
for (size_t idx = 0; idx < bs_sim.size(); idx++) {
@@ -4200,8 +4203,8 @@ Same thing with std::string and std::unordered_map | >> Теперь вставляем stringa, а ищем ssa
-Now we insert stringa and search for ssa | 3596978 | 3630665 | 3715466 | 3462807 | 3917153 | 3369803 | std::unordered_map<std::string, size_t> emplace & find std::string_view;void HashMapStdStrView(benchmark::State& state) {
+Now we insert stringa and search for ssa | 3718652 | 3815600 | 3848145 | 3619495 | 4127357 | 3244867 | std::unordered_map<std::string, size_t> emplace & find std::string_view;void HashMapStdStrView(benchmark::State& state) {
for (auto _: state) {
std::unordered_map<std::string, size_t> store;
for (size_t idx = 0; idx < bs_std.size(); idx++) {
@@ -4225,17 +4228,17 @@ Now we insert stringa and search for ssa | >> Вставляем std::string, а ищем std::string_view
-We insert std::string and look for std::string_view | 4271995 | 4042057 | 3948260 | 6453507 | 6341143 | 4260216 | | 4196609 | 4134155 | 4076242 | 6497268 | 6592167 | 4041903 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 libc++ | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-15 | Xeon E5-2682 v4, Windows 10, Clang-22 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-22 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Build func full name std::string;std::string build_full_name_std() const {
+| Build func full name std::string;std::string build_full_name_std() const {
std::string str{has_ret_type_resolver ? "any"sv : type_names_sv[(unsigned)ret_type]};
str += " ";
str += std_name;
@@ -4272,8 +4275,8 @@ We insert std::string and look for std::string_view | 652 | 991 | 733 | 1543 | 1574 | 3466 | Build func full name std::string 1;std::string build_full_name_std1() const {
+return values. The algorithm uses std::string. | 673 | 1021 | 738 | 1507 | 1622 | 3162 | Build func full name std::string 1;std::string build_full_name_std1() const {
std::string str{has_ret_type_resolver ? "any"sv : type_names_sv[(unsigned)ret_type]};
str += " " + std_name + "(";
@@ -4304,8 +4307,8 @@ return values. The algorithm uses std::string. | >> Почти тот же алгоритм, но несколько последовательных
+= к строке заменены на одно += + + +.
Almost the same algorithm, but several consecutive
-+= to a string are replaced with a single += + + +. | 722 | 997 | 789 | 1527 | 1638 | 3613 | Build func full name std::stream;std::string build_full_name_stream() const {
++= to a string are replaced with a single += + + +. | 768 | 1021 | 820 | 1515 | 1697 | 3363 | Build func full name std::stream;std::string build_full_name_stream() const {
std::ostringstream str;
if (has_ret_type_resolver) {
str << "any";
@@ -4338,8 +4341,8 @@ Almost the same algorithm, but several consecutive
str << ")";
return str.str();
} | >> Строим имя функции через std::ostringstream и <<
-We construct the function name through std::ostringstream and << | 2537 | 2832 | 2490 | 8122 | 9771 | 13169 | Build func full name stringa;stringa build_full_name() const {
+We construct the function name through std::ostringstream and << | 3165 | 2984 | 2610 | 8296 | 9698 | 11876 | Build func full name stringa;stringa build_full_name() const {
lstringa<512> str = e_choice(has_ret_type_resolver, "any", type_names[(unsigned)ret_type]) + " " + name + "(";
bool add_comma = false;
@@ -4356,8 +4359,8 @@ We construct the function name through std::ostringstream and <<
} | >> Реализация на simstr строках и строковых выражениях.
Инфа о параметрах добавляется в текущую строку
Implementation using simstr strings and string expressions.
-Parameter information is appended to the current line. | 483 | 443 | 449 | 765 | 855 | 1567 | Build func full name stringa 1;stringa build_full_name1() const {
+Parameter information is appended to the current line. | 472 | 471 | 480 | 749 | 867 | 1461 | Build func full name stringa 1;stringa build_full_name1() const {
lstringa<512> str = e_choice(has_ret_type_resolver, "any", type_names[(unsigned)ret_type]) + " " + name + "(";
bool add_comma = false;
@@ -4374,18 +4377,18 @@ Parameter information is appended to the current line. | 599 | 597 | 530 | 852 | 988 | 1808 | | 616 | 648 | 564 | 878 | 996 | 1910 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-22 libc++ | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-15 | Xeon E5-2682 v4, Windows 10, Clang-22 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-22 | ||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
To upper case std::wstringvoid UpperCaseStd(benchmark::State& state) {
+| To upper case std::wstringvoid UpperCaseStd(benchmark::State& state) {
static const auto& loc = std::locale("en_US.utf8");
for (auto _: state) {
@@ -4403,8 +4406,8 @@ to be written in a single string, but is slightly slower in execution time. | 150 | 167 | 168 | 1405 | 1404 | 226 | To upper case lstringw<15>void UpperCaseSim(benchmark::State& state) {
+} | 162 | 175 | 175 | 1457 | 1438 | 204 | To upper case lstringw<15>void UpperCaseSim(benchmark::State& state) {
for (auto _: state) {
lstringw<15> test = L"TestПриветTest";
benchmark::DoNotOptimize(test);
@@ -4418,8 +4421,8 @@ to be written in a single string, but is slightly slower in execution time. | 39.8 | 40.3 | 39.3 | 36.2 | 47.9 | 68.2 | | 43.7 | 38.5 | 40.4 | 41.0 | 44.4 | 63.1 |