diff --git a/CMakeLists.txt b/CMakeLists.txt index 207d9c8..42ed1ed 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,7 @@ include(FetchContent) project( simstr - VERSION 1.7.0 + VERSION 1.7.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 e6c56b6..445cf58 100644 --- a/bench/bench_str.cpp +++ b/bench/bench_str.cpp @@ -1,5 +1,5 @@ /* - * ver. 1.7.0 + * ver. 1.7.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 34b5557..aced9c1 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-21 | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-13 | Xeon E5-2682 v4, Windows 10, Clang-19 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-21 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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);
-} | 170 | 190 | 205 | 253 | 993 | Concat email std::stringstreamstd::string email_concat_stream(std::string_view name, std::string_view domain, std::string_view tld) {
+} | 167 | 176 | 210 | 254 | 529 | 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 | 324 | 833 | 946 | 2513 | Concat email stringzilla appendsz::string email_concat_stringzilla_app(sz::string name, sz::string_view domain, sz::string_view tld) {
+} | 324 | 332 | 856 | 934 | 1155 | 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);
-} | 142 | 120 | 267 | 289 | 574 | Concat email stringzilla concatsz::string email_concat_stringzilla_exp(sz::string name, sz::string_view domain, sz::string_view tld) {
+} | 135 | 115 | 271 | 268 | 249 | 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. | 53.1 | 49.2 | 127 | 134 | 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. | 53.5 | 46.6 | 128 | 129 | 95.2 | 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);
-} | 72.9 | 98.9 | 184 | 194 | 636 | Concat email std::string by strexprstd::string email_concat_std_expr(std::string_view name, std::string_view domain, std::string_view tld) {
+} | 72.9 | 99.0 | 187 | 197 | 324 | 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;
-} | 43.5 | 37.6 | 113 | 112 | 159 | Concat email stringastringa email_concat_sim_expr(ssa name, ssa domain, ssa tld) {
+} | 43.5 | 35.6 | 107 | 110 | 92.7 | Concat email stringastringa email_concat_sim_expr(ssa name, ssa domain, ssa tld) {
return name + "@" + domain + "." + tld;
-} | 38.9 | 40.9 | 96.2 | 98.1 | 133 | | 39.4 | 40.5 | 93.1 | 99.5 | 71.3 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-21 | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-13 | Xeon E5-2682 v4, Windows 10, Clang-19 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-21 | ||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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) {
@@ -348,8 +348,8 @@ but it's not as convenient or advanced as simstr. | 220 | 223 | 271 | 314 | 1951 | Concat std::string and number by StrExpr to std::stringvoid ConcatSimToStd(benchmark::State& state) {
+} | 214 | 209 | 264 | 337 | 1115 | 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) {
@@ -358,8 +358,8 @@ but it's not as convenient or advanced as simstr. | 104 | 102 | 162 | 206 | 974 | Concat stringa and number by StrExpr to simstr::stringavoid ConcatSimToSim(benchmark::State& state) {
+} | 104 | 98.1 | 156 | 219 | 530 | 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) {
@@ -375,8 +375,8 @@ but it's not as convenient or advanced as simstr. | 65.3 | 73.6 | 71.6 | 102 | 369 | Concat stringa and number by e_concat to simstr::stringavoid ConcatSimToSimConcat(benchmark::State& state) {
+while in stringa , the entire test is included in SSO. | 67.7 | 73.0 | 69.1 | 111 | 227 | 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) {
@@ -385,17 +385,17 @@ while in stringa , the entire test is included in SSO. | 69.7 | 78.5 | 74.8 | 109 | 367 | | 70.8 | 79.7 | 74.9 | 116 | 258 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-21 | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-13 | Xeon E5-2682 v4, Windows 10, Clang-19 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-21 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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) {
@@ -406,8 +406,8 @@ while in stringa , the entire test is included in SSO. | 692 | 695 | 713 | 1073 | 3765 | std::format std::string and hex number by literal to std::stringvoid ConcatAllFmtToHex(benchmark::State& state) {
+} | 689 | 746 | 715 | 1043 | 2114 | 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) {
@@ -418,8 +418,8 @@ while in stringa , the entire test is included in SSO. | 922 | 995 | 1544 | 1843 | 4994 | Concat std::string and std::to_chars and string to std::stringvoid ConcatStdToCharsHex(benchmark::State& state) {
+} | 889 | 970 | 1496 | 1859 | 2763 | 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) {
@@ -432,8 +432,8 @@ while in stringa , the entire test is included in SSO. | 198 | 250 | 192 | 255 | 1114 | Concat std::string and hex number and literal by StrExpr to std::stringvoid ConcatSimToStdHex(benchmark::State& state) {
+} | 199 | 254 | 194 | 256 | 743 | 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) {
@@ -444,8 +444,8 @@ while in stringa , the entire test is included in SSO. | 132 | 125 | 91.6 | 114 | 885 | Concat stringa and hex number and literal by StrExpr to simstr::stringavoid ConcatSimToSimHex(benchmark::State& state) {
+} | 134 | 126 | 89.2 | 136 | 547 | 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) {
@@ -456,8 +456,8 @@ while in stringa , the entire test is included in SSO. | 116 | 122 | 72.9 | 102 | 252 | Concat stringa and hex number and literal by e_concat to simstr::stringavoid ConcatSimToSimHexC(benchmark::State& state) {
+} | 117 | 120 | 70.7 | 105 | 220 | 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) {
@@ -468,8 +468,8 @@ while in stringa , the entire test is included in SSO. | 124 | 128 | 77.5 | 104 | 276 | Subst stringa and hex number by e_subst literal to simstr::stringavoid ConcatSimToSimHexS(benchmark::State& state) {
+} | 123 | 128 | 77.7 | 103 | 211 | 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) {
@@ -479,8 +479,8 @@ while in stringa , the entire test is included in SSO. | 181 | 174 | 154 | 176 | 548 | Subst stringa and hex number by e_vsubst stra to simstr::stringavoid ConcatSimToSimHexVS(benchmark::State& state) {
+} | 188 | 169 | 156 | 176 | 354 | 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) {
@@ -490,37 +490,37 @@ while in stringa , the entire test is included in SSO. | 312 | 304 | 287 | 365 | 1724 | | 310 | 292 | 291 | 362 | 936 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-21 | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-13 | Xeon E5-2682 v4, Windows 10, Clang-19 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-21 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
"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);
}
}
-} | 276 | 264 | 671 | 682 | 930 | e_subst("abcdefghihklmopqr {} end", i / 0x8a010_fmt)void SubstSimToSimOct(benchmark::State& state) {
+} | 277 | 261 | 685 | 701 | 434 | 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);
}
}
-} | 352 | 318 | 750 | 798 | 1123 | e_vsubst(pattern, i / 0x8a010_fmt)void VSubstSimToSimOct(benchmark::State& state) {
+} | 353 | 320 | 758 | 798 | 634 | 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) {
@@ -528,16 +528,16 @@ while in stringa , the entire test is included in SSO. | 616 | 583 | 1081 | 1128 | 2923 | fmt::format(FMT_COMPILE("abcdefghihklmopqr {:#010o} end"), i)void FmtFormatComp(benchmark::State& state) {
+} | 615 | 614 | 1128 | 1111 | 1530 | 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);
}
}
-} | 755 | 809 | 1449 | 1577 | 4411 | fmt::format("abcdefghihklmopqr {:#010o} end", i)void FmtFormat(benchmark::State& state) {
+} | 685 | 745 | 1424 | 1617 | 2320 | 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);
@@ -545,16 +545,16 @@ while in stringa , the entire test is included in SSO. | 894 | 882 | 1364 | 1535 | 4578 | std::format("abcdefghihklmopqr {:#010o} end", i)void FormatStdToStdOct(benchmark::State& state) {
+} | 854 | 847 | 1375 | 1440 | 3086 | 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);
}
}
-} | 992 | 1261 | 1699 | 1931 | 5729 | std::vformat(pattern, std::make_format_args(i))void VFormatStdToStdOct(benchmark::State& state) {
+} | 1016 | 1276 | 1657 | 1885 | 3154 | 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) {
@@ -562,8 +562,8 @@ while in stringa , the entire test is included in SSO. | 1000 | 1151 | 1586 | 1914 | 5777 | strm << "abcdefghihklmopqr 0" << std::oct << std::setw(9) << std::setfill('0') << i << " end"void StreamStdToStdOct(benchmark::State& state) {
+} | 1016 | 1145 | 1574 | 1957 | 3173 | 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;
@@ -572,21 +572,21 @@ while in stringa , the entire test is included in SSO. | 2055 | 2133 | 6885 | 7062 | 18843 | | 2057 | 2189 | 6773 | 7169 | 8797 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-21 | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-13 | Xeon E5-2682 v4, Windows 10, Clang-19 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-21 | ||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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) {
@@ -595,8 +595,8 @@ while in stringa , the entire test is included in SSO. | 44.3 | 49.8 | 40.8 | 55.6 | 155 | Concat std::string by StrExpr to std::stringvoid ConcatSimToStdS(benchmark::State& state) {
+} | 45.6 | 49.4 | 44.0 | 59.3 | 115 | 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) {
@@ -605,8 +605,8 @@ while in stringa , the entire test is included in SSO. | 31.3 | 32.3 | 38.2 | 79.3 | 175 | Concat stringa by StrExpr to stringavoid ConcatSimToSimS(benchmark::State& state) {
+} | 32.2 | 31.8 | 39.2 | 77.1 | 128 | 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) {
@@ -615,41 +615,41 @@ while in stringa , the entire test is included in SSO. | 28.4 | 26.4 | 28.7 | 50.7 | 146 | | 28.5 | 27.9 | 28.9 | 51.4 | 110 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-21 | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-13 | Xeon E5-2682 v4, Windows 10, Clang-19 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-21 | ||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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");
-} | 114 | 146 | 208 | 219 | 501 | Find concat three strexprsize_t find_pos_exp(ssa src, ssa name) {
+} | 114 | 140 | 206 | 212 | 226 | Find concat three strexprsize_t find_pos_exp(ssa src, ssa name) {
return src.find(std::string{"\n- " + name + " -\n"});
-} | 49.3 | 39.0 | 114 | 125 | 288 | Find concat three simstrsize_t find_pos_sim(ssa src, ssa name) {
+} | 49.6 | 38.1 | 117 | 123 | 117 | 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. | 19.4 | 16.4 | 21.5 | 28.4 | 174 | 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. | 19.5 | 16.1 | 21.4 | 28.3 | 71.5 | 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"));
-} | 143 | 139 | 214 | 228 | 621 | | 145 | 130 | 217 | 231 | 288 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-21 | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-13 | Xeon E5-2682 v4, Windows 10, Clang-19 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-21 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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);
@@ -659,20 +659,20 @@ it is collected in a stack-based buffer, without allocation or deallocation. | 7.09 | 10.8 | 8.40 | 17.4 | 27.5 | BuildTypeNameExp 0/0std::string buildTypeNameExp(ssa type_name, size_t prec, size_t scale) {
+} | 7.33 | 10.0 | 8.40 | 17.3 | 23.4 | 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.90 | 8.49 | 7.43 | 12.8 | 29.2 | BuildTypeNameSim 0/0stringa buildTypeNameSim(ssa type_name, size_t prec, size_t scale) {
+} | 6.78 | 8.41 | 7.59 | 13.5 | 27.3 | 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.95 | 4.96 | 7.80 | 15.1 | 38.8 | BuildTypeNameStr 10/10std::string buildTypeNameStr(std::string_view type_name, size_t prec, size_t scale) {
+} | 5.04 | 5.95 | 7.74 | 15.2 | 20.9 | 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);
@@ -682,31 +682,31 @@ it is collected in a stack-based buffer, without allocation or deallocation. | 56.3 | 87.2 | 58.8 | 77.5 | 661 | BuildTypeNameExp 10/10std::string buildTypeNameExp(ssa type_name, size_t prec, size_t scale) {
+} | 57.9 | 79.6 | 60.1 | 80.4 | 403 | 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;
-} | 31.0 | 26.8 | 32.1 | 39.5 | 201 | BuildTypeNameSim 10/10stringa buildTypeNameSim(ssa type_name, size_t prec, size_t scale) {
+} | 31.0 | 26.7 | 33.0 | 39.4 | 122 | 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;
-} | 22.8 | 23.2 | 25.6 | 38.3 | 105 | | 23.6 | 23.7 | 25.5 | 37.3 | 75.6 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-21 | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-13 | Xeon E5-2682 v4, Windows 10, Clang-19 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-21 | ||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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; ;) {
@@ -722,74 +722,74 @@ it is collected in a stack-based buffer, without allocation or deallocation.";
-} | 213 | 235 | 309 | 343 | 1091 | Concat with replace expstd::string make_str_exp(std::string_view from, std::string_view pattern, std::string_view repl) {
+} | 203 | 233 | 317 | 359 | 544 | 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. | 147 | 142 | 217 | 225 | 502 | | 147 | 136 | 214 | 220 | 258 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-21 | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-13 | Xeon E5-2682 v4, Windows 10, Clang-19 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-21 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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.11 | 1.14 | 1.10 | 2.59 | 2.63 | std::string_view e;template<typename T>
+Empty lines, nothing unusual. | 1.12 | 1.10 | 1.13 | 2.60 | 2.28 | std::string_view e;template<typename T>
void CreateEmpty(benchmark::State& state) {
for (auto _: state) {
T empty_string;
benchmark::DoNotOptimize(empty_string);
}
-} | 0.369 | 0.770 | 0.366 | 1.84 | 2.19 | ssa e;template<typename T>
+} | 0.370 | 0.743 | 0.369 | 1.84 | 0.732 | ssa e;template<typename T>
void CreateEmpty(benchmark::State& state) {
for (auto _: state) {
T empty_string;
benchmark::DoNotOptimize(empty_string);
}
-} | 0.371 | 0.188 | 0.364 | 1.84 | 2.14 | stringa e;template<typename T>
+} | 0.369 | 0.185 | 0.363 | 1.87 | 0.368 | stringa e;template<typename T>
void CreateEmpty(benchmark::State& state) {
for (auto _: state) {
T empty_string;
benchmark::DoNotOptimize(empty_string);
}
-} | 0.758 | 0.777 | 0.745 | 2.20 | 2.97 | lstringa<20> e;template<typename T>
+} | 0.749 | 0.743 | 0.744 | 2.21 | 2.14 | lstringa<20> e;template<typename T>
void CreateEmpty(benchmark::State& state) {
for (auto _: state) {
T empty_string;
benchmark::DoNotOptimize(empty_string);
}
-} | 1.14 | 1.14 | 1.12 | 2.58 | 3.67 | lstringa<40> e;template<typename T>
+} | 1.13 | 1.11 | 1.15 | 2.59 | 2.17 | lstringa<40> e;template<typename T>
void CreateEmpty(benchmark::State& state) {
for (auto _: state) {
T empty_string;
benchmark::DoNotOptimize(empty_string);
}
-} | 1.15 | 1.18 | 1.16 | 2.54 | 3.54 | | 1.13 | 1.12 | 1.11 | 2.59 | 2.48 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-21 | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-13 | Xeon E5-2682 v4, Windows 10, Clang-19 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-21 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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;
@@ -798,8 +798,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.85 | 1.91 | 1.85 | 2.53 | 3.39 | std::string_view e = "Test text";template<typename T>
+time is spent only copying 10 bytes. | 1.86 | 1.87 | 1.82 | 2.61 | 2.43 | std::string_view e = "Test text";template<typename T>
void CreateShortLiteral(benchmark::State& state) {
for (auto _: state) {
T empty_string = TEST_TEXT;
@@ -808,15 +808,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.760 | 0.765 | 0.736 | 1.84 | 2.19 | ssa e = "Test text";template<typename T>
+a pointer to text and its length. | 0.743 | 0.758 | 0.729 | 1.84 | 1.09 | 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.380 | 0.765 | 0.363 | 1.82 | 2.14 | stringa e = "Test text";template<typename T>
+} | 0.376 | 0.742 | 0.371 | 1.87 | 0.726 | stringa e = "Test text";template<typename T>
void CreateShortLiteral(benchmark::State& state) {
for (auto _: state) {
T empty_string = TEST_TEXT;
@@ -825,8 +825,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.13 | 1.11 | 3.04 | 3.03 | lstringa<20> e = "Test text";template<typename T>
+only a pointer to the text and its length. | 1.11 | 1.13 | 1.11 | 2.59 | 2.19 | lstringa<20> e = "Test text";template<typename T>
void CreateShortLiteral(benchmark::State& state) {
for (auto _: state) {
T empty_string = TEST_TEXT;
@@ -835,26 +835,26 @@ void CreateShortLiteral(benchmark::State& state) {
} | >> Внутреннего буфера хватает для размещения символов,
время уходит только на копирование байтов.
The internal buffer is sufficient to accommodate characters;
-time is spent only on copying bytes. | 1.91 | 1.90 | 1.85 | 2.57 | 3.96 | lstringa<40> e = "Test text";template<typename T>
+time is spent only on copying bytes. | 1.89 | 1.86 | 1.85 | 2.65 | 2.62 | 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.83 | 1.92 | 1.84 | 2.62 | 3.99 | | 1.86 | 1.87 | 1.83 | 2.58 | 2.59 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-21 | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-13 | Xeon E5-2682 v4, Windows 10, Clang-19 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-21 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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};
@@ -865,8 +865,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... | 21.7 | 20.2 | 76.0 | 77.2 | 69.1 | std::string_view e = "123456789012345678901234567890";template<typename T>
+But how much slower is allocation under Windows than under Linux, 20 ns vs. 70 ns... | 20.0 | 20.8 | 75.8 | 80.5 | 26.1 | std::string_view e = "123456789012345678901234567890";template<typename T>
void CreateLongLiteral(benchmark::State& state) {
for (auto _: state) {
T empty_string{LONG_TEXT};
@@ -875,23 +875,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.735 | 0.759 | 0.735 | 1.84 | 2.17 | ssa e = "123456789012345678901234567890";template<typename T>
+remember the pointer to the text and its size. | 0.744 | 0.733 | 0.727 | 1.80 | 1.15 | ssa e = "123456789012345678901234567890";template<typename T>
void CreateLongLiteral(benchmark::State& state) {
for (auto _: state) {
T empty_string{LONG_TEXT};
benchmark::DoNotOptimize(empty_string);
}
-} | 0.383 | 0.767 | 0.364 | 1.84 | 2.14 | stringa e = "123456789012345678901234567890";template<typename T>
+} | 0.373 | 0.748 | 0.369 | 1.87 | 0.737 | 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.20 | 1.10 | 2.20 | 2.97 | lstringa<20> e = "123456789012345678901234567890";template<typename T>
+stringa doesn't lag behind on constant literals! | 1.11 | 1.13 | 1.09 | 2.89 | 2.21 | lstringa<20> e = "123456789012345678901234567890";template<typename T>
void CreateLongLiteral(benchmark::State& state) {
for (auto _: state) {
T empty_string{LONG_TEXT};
@@ -899,8 +899,8 @@ void CreateLongLiteral(benchmark::State& state) {
}
} | >> lstringa<20> может вместить в себя до 23 символов,
Очевидно, что для 30-и символов уже нужна аллокация.
-Obviously, 30 characters already require allocation. | 21.0 | 24.0 | 73.7 | 74.5 | 69.7 | lstringa<40> e = "123456789012345678901234567890";template<typename T>
+Obviously, 30 characters already require allocation. | 21.2 | 20.2 | 76.5 | 76.2 | 24.2 | lstringa<40> e = "123456789012345678901234567890";template<typename T>
void CreateLongLiteral(benchmark::State& state) {
for (auto _: state) {
T empty_string{LONG_TEXT};
@@ -909,19 +909,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.59 | 1.94 | 2.54 | 3.34 | 16.5 | | 2.59 | 1.86 | 2.52 | 3.40 | 2.92 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-21 | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-13 | Xeon E5-2682 v4, Windows 10, Clang-19 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-21 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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) {
@@ -930,8 +930,8 @@ void CopyShortString(benchmark::State& state) {
benchmark::DoNotOptimize(x);
}
} | >> Строка в пределах SSO, так что просто копирует байты.
-The string is within the SSO, so it just copies the bytes. | 5.27 | 5.67 | 1.83 | 5.36 | 6.73 | 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.24 | 4.89 | 1.86 | 5.98 | 3.78 | std::string_view e = "Test text"; auto c{e};template<typename T>
void CopyShortString(benchmark::State& state) {
T x{TEST_TEXT};
for (auto _: state) {
@@ -939,8 +939,8 @@ void CopyShortString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 0.383 | 0.378 | 0.366 | 2.92 | 2.20 | ssa e = "Test text"; auto c{e};template<typename T>
+} | 0.371 | 0.382 | 0.370 | 3.49 | 1.08 | ssa e = "Test text"; auto c{e};template<typename T>
void CopyShortString(benchmark::State& state) {
T x{TEST_TEXT};
for (auto _: state) {
@@ -951,8 +951,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.376 | 0.391 | 0.364 | 2.92 | 2.21 | stringa e = "Test text"; auto c{e};template<typename T>
+string information is copied. | 0.376 | 0.382 | 0.365 | 3.51 | 1.21 | stringa e = "Test text"; auto c{e};template<typename T>
void CopyShortString(benchmark::State& state) {
T x{TEST_TEXT};
for (auto _: state) {
@@ -963,8 +963,8 @@ void CopyShortString(benchmark::State& state) {
} | >> Копирование stringa происходит быстро,
особенно если она инициализирована литералом.
Copying a stringa is fast,
-especially if it is initialized with a literal. | 1.11 | 1.12 | 1.31 | 4.11 | 4.66 | lstringa<20> e = "Test text"; auto c{e};template<typename T>
+especially if it is initialized with a literal. | 1.10 | 1.31 | 1.32 | 4.07 | 2.70 | lstringa<20> e = "Test text"; auto c{e};template<typename T>
void CopyShortString(benchmark::State& state) {
T x{TEST_TEXT};
for (auto _: state) {
@@ -973,8 +973,8 @@ void CopyShortString(benchmark::State& state) {
benchmark::DoNotOptimize(x);
}
} | >> В обоих случаях хватает внутреннего буфера.
-In both cases, the internal buffer is sufficient. | 1.50 | 1.14 | 1.47 | 4.71 | 7.15 | lstringa<40> e = "Test text"; auto c{e};template<typename T>
+In both cases, the internal buffer is sufficient. | 1.50 | 1.14 | 1.50 | 4.75 | 4.86 | lstringa<40> e = "Test text"; auto c{e};template<typename T>
void CopyShortString(benchmark::State& state) {
T x{TEST_TEXT};
for (auto _: state) {
@@ -983,19 +983,19 @@ void CopyShortString(benchmark::State& state) {
benchmark::DoNotOptimize(x);
}
} | >> Только копируются байты.
-Only bytes are copied. | 1.52 | 1.15 | 1.48 | 5.44 | 7.34 | | 1.48 | 1.12 | 1.50 | 4.91 | 4.84 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-21 | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-13 | Xeon E5-2682 v4, Windows 10, Clang-19 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-21 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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) {
@@ -1005,24 +1005,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.1 | 24.6 | 72.4 | 78.7 | 119 | std::string_view e = "123456789012345678901234567890"; auto c{e};template<typename T>
+SSO is no longer sufficient. And again, how allocation lags under Windows... | 19.3 | 24.5 | 79.4 | 77.8 | 53.4 | 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.752 | 0.775 | 0.734 | 1.49 | 2.22 | ssa e = "123456789012345678901234567890"; auto c{e};template<typename T>
+} | 0.744 | 0.746 | 0.743 | 1.85 | 1.12 | 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.375 | 0.747 | 0.364 | 1.52 | 2.16 | stringa e = "123456789012345678901234567890"; auto c{e};template<typename T>
+} | 0.379 | 0.746 | 0.374 | 1.85 | 0.746 | stringa e = "123456789012345678901234567890"; auto c{e};template<typename T>
void CopyLongString(benchmark::State& state) {
T x = LONG_TEXT;
for (auto _: state) {
@@ -1032,8 +1032,8 @@ void CopyLongString(benchmark::State& state) {
} | >> А вот у stringa копирование литерала не зависит от его длины,
сравни с предыдущим бенчмарком.
But with stringa, literal copying doesn't depend on its length,
-compare with the previous benchmark. | 1.11 | 1.19 | 1.84 | 2.93 | 2.98 | lstringa<20> e = "123456789012345678901234567890"; auto c{e};template<typename T>
+compare with the previous benchmark. | 1.11 | 1.11 | 1.83 | 3.01 | 2.18 | lstringa<20> e = "123456789012345678901234567890"; auto c{e};template<typename T>
void CopyLongString(benchmark::State& state) {
T x = LONG_TEXT;
for (auto _: state) {
@@ -1041,8 +1041,8 @@ void CopyLongString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
}
} | >> Не влезает, аллокация.
-Doesn't fit, allocation. | 21.5 | 20.4 | 75.7 | 79.5 | 72.7 | lstringa<40> e = "123456789012345678901234567890"; auto c{e};template<typename T>
+Doesn't fit, allocation. | 20.7 | 21.2 | 76.4 | 82.2 | 22.5 | lstringa<40> e = "123456789012345678901234567890"; auto c{e};template<typename T>
void CopyLongString(benchmark::State& state) {
T x = LONG_TEXT;
for (auto _: state) {
@@ -1050,19 +1050,19 @@ void CopyLongString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
}
} | >> Уложили во внутренний буфер.
-Placed in the internal buffer. | 4.61 | 4.84 | 4.84 | 7.37 | 50.4 | | 4.59 | 4.20 | 4.95 | 7.97 | 17.0 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-21 | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-13 | Xeon E5-2682 v4, Windows 10, Clang-19 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-21 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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) {
@@ -1077,8 +1077,8 @@ void Find(benchmark::State& state) {
benchmark::DoNotOptimize(x);
}
} | >> stringzilla более заточена на поиск больших строк в больших строках.
-stringzilla is more focused on searching large strings within large strings. | 95.0 | 95.3 | 98.2 | 117 | 231 | std::string::find;template<typename T>
+stringzilla is more focused on searching large strings within large strings. | 94.7 | 92.9 | 97.9 | 116 | 123 | std::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 +1095,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.29 | 6.95 | 39.9 | 39.2 | 99.9 | std::string_view::find;template<typename T>
+However, Windows and Linux are clearly in different weight classes. | 7.15 | 6.97 | 40.2 | 40.4 | 40.4 | 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) {
@@ -1110,8 +1110,8 @@ void Find(benchmark::State& state) {
benchmark::DoNotOptimize(i);
benchmark::DoNotOptimize(x);
}
-} | 7.54 | 8.19 | 52.2 | 39.0 | 96.4 | ssa::find;template<typename T>
+} | 7.65 | 7.27 | 52.2 | 39.5 | 43.8 | ssa::find;template<typename T>
void Find(benchmark::State& state) {
T x{LONG_TEXT LONG_TEXT LONG_TEXT TEST_TEXT};
for (auto _: state) {
@@ -1125,8 +1125,8 @@ void Find(benchmark::State& state) {
benchmark::DoNotOptimize(i);
benchmark::DoNotOptimize(x);
}
-} | 7.60 | 6.99 | 18.9 | 21.9 | 97.9 | stringa::find;template<typename T>
+} | 7.31 | 6.74 | 19.3 | 22.2 | 41.7 | stringa::find;template<typename T>
void Find(benchmark::State& state) {
T x{LONG_TEXT LONG_TEXT LONG_TEXT TEST_TEXT};
for (auto _: state) {
@@ -1140,8 +1140,8 @@ void Find(benchmark::State& state) {
benchmark::DoNotOptimize(i);
benchmark::DoNotOptimize(x);
}
-} | 8.42 | 6.91 | 19.4 | 31.0 | 99.1 | lstringa<20>::find;template<typename T>
+} | 8.30 | 6.85 | 19.4 | 31.4 | 41.7 | lstringa<20>::find;template<typename T>
void Find(benchmark::State& state) {
T x{LONG_TEXT LONG_TEXT LONG_TEXT TEST_TEXT};
for (auto _: state) {
@@ -1155,8 +1155,8 @@ void Find(benchmark::State& state) {
benchmark::DoNotOptimize(i);
benchmark::DoNotOptimize(x);
}
-} | 6.84 | 6.65 | 17.6 | 21.9 | 115 | lstringa<40>::find;template<typename T>
+} | 6.70 | 6.45 | 17.9 | 22.4 | 39.4 | lstringa<40>::find;template<typename T>
void Find(benchmark::State& state) {
T x{LONG_TEXT LONG_TEXT LONG_TEXT TEST_TEXT};
for (auto _: state) {
@@ -1170,20 +1170,20 @@ void Find(benchmark::State& state) {
benchmark::DoNotOptimize(i);
benchmark::DoNotOptimize(x);
}
-} | 6.91 | 6.58 | 18.0 | 22.2 | 115 | | 6.75 | 6.42 | 18.1 | 22.0 | 39.6 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-21 | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-13 | Xeon E5-2682 v4, Windows 10, Clang-19 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-21 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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) {
@@ -1191,8 +1191,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 5.95 | 9.01 | 1.85 | 5.24 | 125 | std::string copy{str_with_len_N};/16template<typename T>
+} | 5.79 | 8.62 | 1.87 | 5.26 | 54.0 | std::string copy{str_with_len_N};/16template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1205,8 +1205,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.3 | 28.5 | 78.8 | 79.3 | 125 | std::string copy{str_with_len_N};/23template<typename T>
+smaller, as far as I remember: 11 characters + 0. | 23.7 | 28.1 | 82.8 | 83.1 | 50.8 | std::string copy{str_with_len_N};/23template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1215,8 +1215,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(x);
}
} | >> Дальше просто добавляется время на копирование байтов.
-Then the time for copying bytes is simply added. | 23.8 | 27.8 | 77.2 | 77.7 | 126 | std::string copy{str_with_len_N};/24template<typename T>
+Then the time for copying bytes is simply added. | 22.8 | 27.6 | 80.2 | 82.5 | 50.7 | std::string copy{str_with_len_N};/24template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1224,8 +1224,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 23.5 | 28.8 | 77.5 | 77.5 | 120 | std::string copy{str_with_len_N};/32template<typename T>
+} | 23.4 | 27.9 | 78.8 | 82.7 | 51.0 | std::string copy{str_with_len_N};/32template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1233,8 +1233,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 24.0 | 27.3 | 83.0 | 86.2 | 124 | std::string copy{str_with_len_N};/64template<typename T>
+} | 23.0 | 27.6 | 86.0 | 83.9 | 57.8 | std::string copy{str_with_len_N};/64template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1242,8 +1242,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 23.1 | 27.0 | 81.2 | 80.0 | 123 | std::string copy{str_with_len_N};/128template<typename T>
+} | 22.8 | 26.4 | 84.4 | 85.2 | 57.0 | std::string copy{str_with_len_N};/128template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1251,8 +1251,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 25.3 | 29.2 | 83.8 | 84.8 | 133 | std::string copy{str_with_len_N};/256template<typename T>
+} | 24.9 | 28.2 | 90.9 | 86.3 | 57.2 | std::string copy{str_with_len_N};/256template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1260,8 +1260,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 31.4 | 34.2 | 88.0 | 88.0 | 156 | std::string copy{str_with_len_N};/512template<typename T>
+} | 31.4 | 33.5 | 87.4 | 88.9 | 68.5 | std::string copy{str_with_len_N};/512template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1269,8 +1269,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 28.8 | 34.0 | 92.5 | 88.8 | 150 | std::string copy{str_with_len_N};/1024template<typename T>
+} | 29.2 | 33.2 | 90.0 | 93.3 | 65.9 | std::string copy{str_with_len_N};/1024template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1278,8 +1278,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 34.9 | 37.7 | 102 | 97.7 | 174 | std::string copy{str_with_len_N};/2048template<typename T>
+} | 33.8 | 37.8 | 100 | 99.3 | 88.6 | std::string copy{str_with_len_N};/2048template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1287,8 +1287,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 81.2 | 81.1 | 123 | 135 | 217 | std::string copy{str_with_len_N};/4096template<typename T>
+} | 77.6 | 81.0 | 129 | 131 | 113 | std::string copy{str_with_len_N};/4096template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1297,8 +1297,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(x);
}
} | >> Чем длиннее строка, тем дольше создаётся копия.
-The longer the string, the longer it takes to create a copy. | 120 | 120 | 175 | 183 | 263 | stringa copy{str_with_len_N};/15template<typename T>
+The longer the string, the longer it takes to create a copy. | 117 | 121 | 180 | 184 | 159 | stringa copy{str_with_len_N};/15template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1309,8 +1309,8 @@ void CopyDynString(benchmark::State& state) {
} | >> Здесь stringa инициализируется не литералом,
а значит, должна сама хранить символы.
Here, stringa is not initialized with a literal,
-meaning it must store characters itself. | 1.09 | 1.35 | 1.29 | 4.09 | 4.83 | stringa copy{str_with_len_N};/16template<typename T>
+meaning it must store characters itself. | 1.10 | 1.31 | 1.32 | 4.06 | 2.40 | stringa copy{str_with_len_N};/16template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1323,8 +1323,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.10 | 1.34 | 1.29 | 4.08 | 7.81 | stringa copy{str_with_len_N};/23template<typename T>
+increment was replaced with a regular one, judging by the time. | 1.09 | 1.30 | 1.33 | 4.11 | 4.81 | stringa copy{str_with_len_N};/23template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1335,8 +1335,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.32 | 1.31 | 3.99 | 8.12 | stringa copy{str_with_len_N};/24template<typename T>
+copies faster than 15 in std::string. | 1.10 | 1.30 | 1.33 | 3.97 | 4.81 | stringa copy{str_with_len_N};/24template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1347,8 +1347,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.1 | 16.7 | 15.9 | 18.6 | 7.86 | stringa copy{str_with_len_N};/32template<typename T>
+Time is added for the atomic counter increment. | 16.0 | 16.2 | 15.9 | 18.5 | 4.86 | stringa copy{str_with_len_N};/32template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1356,8 +1356,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 16.0 | 16.4 | 17.4 | 18.5 | 7.82 | stringa copy{str_with_len_N};/64template<typename T>
+} | 16.0 | 16.1 | 15.8 | 19.0 | 4.81 | stringa copy{str_with_len_N};/64template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1365,8 +1365,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 16.3 | 16.4 | 16.0 | 18.6 | 7.90 | stringa copy{str_with_len_N};/128template<typename T>
+} | 16.1 | 16.2 | 15.8 | 18.5 | 5.13 | stringa copy{str_with_len_N};/128template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1374,8 +1374,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 16.1 | 16.5 | 16.0 | 18.5 | 7.78 | stringa copy{str_with_len_N};/256template<typename T>
+} | 16.1 | 16.1 | 15.9 | 18.9 | 5.28 | stringa copy{str_with_len_N};/256template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1383,8 +1383,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 16.1 | 16.4 | 16.0 | 18.7 | 8.03 | stringa copy{str_with_len_N};/512template<typename T>
+} | 16.0 | 16.2 | 15.8 | 18.5 | 5.19 | stringa copy{str_with_len_N};/512template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1392,8 +1392,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 16.0 | 16.4 | 16.0 | 18.6 | 7.91 | stringa copy{str_with_len_N};/1024template<typename T>
+} | 16.0 | 16.2 | 15.9 | 18.5 | 4.80 | stringa copy{str_with_len_N};/1024template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1401,8 +1401,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 16.2 | 16.6 | 16.0 | 18.6 | 7.78 | stringa copy{str_with_len_N};/2048template<typename T>
+} | 16.0 | 16.1 | 15.9 | 18.8 | 4.86 | stringa copy{str_with_len_N};/2048template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1410,8 +1410,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 16.2 | 16.7 | 16.0 | 18.5 | 7.80 | stringa copy{str_with_len_N};/4096template<typename T>
+} | 16.5 | 16.3 | 15.8 | 18.5 | 4.82 | stringa copy{str_with_len_N};/4096template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1422,8 +1422,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.9 | 16.0 | 18.6 | 7.79 | lstringa<16> copy{str_with_len_N};/15template<typename T>
+increment; copying time does not depend on the string length. | 16.1 | 16.1 | 16.0 | 18.7 | 4.82 | lstringa<16> copy{str_with_len_N};/15template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1434,8 +1434,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.52 | 1.16 | 1.52 | 4.08 | 8.00 | lstringa<16> copy{str_with_len_N};/16template<typename T>
+WASM has a 32-bit architecture, so SSO is up to 19 characters. | 1.51 | 1.09 | 1.55 | 4.59 | 4.09 | lstringa<16> copy{str_with_len_N};/16template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1443,8 +1443,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 4.83 | 4.98 | 5.17 | 8.48 | 20.7 | lstringa<16> copy{str_with_len_N};/23template<typename T>
+} | 4.98 | 4.54 | 5.54 | 9.69 | 16.1 | lstringa<16> copy{str_with_len_N};/23template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1452,8 +1452,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 4.81 | 5.05 | 5.12 | 8.50 | 88.9 | lstringa<16> copy{str_with_len_N};/24template<typename T>
+} | 5.02 | 4.54 | 5.65 | 9.56 | 38.4 | lstringa<16> copy{str_with_len_N};/24template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1462,8 +1462,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(x);
}
} | >> И после начинает вести себя при копировании, как std::string.
-And then it starts to behave like std::string when copied. | 25.0 | 24.6 | 77.9 | 78.6 | 88.3 | lstringa<16> copy{str_with_len_N};/32template<typename T>
+And then it starts to behave like std::string when copied. | 25.3 | 24.5 | 79.9 | 81.8 | 39.6 | lstringa<16> copy{str_with_len_N};/32template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1471,8 +1471,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 25.1 | 24.4 | 83.5 | 83.2 | 92.9 | lstringa<16> copy{str_with_len_N};/64template<typename T>
+} | 25.3 | 24.6 | 87.1 | 85.0 | 41.7 | lstringa<16> copy{str_with_len_N};/64template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1480,8 +1480,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 27.4 | 26.2 | 84.6 | 84.0 | 96.1 | lstringa<16> copy{str_with_len_N};/128template<typename T>
+} | 26.8 | 26.2 | 83.3 | 83.6 | 42.5 | lstringa<16> copy{str_with_len_N};/128template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1489,8 +1489,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 27.1 | 27.6 | 84.6 | 87.1 | 97.2 | lstringa<16> copy{str_with_len_N};/256template<typename T>
+} | 27.1 | 26.6 | 89.2 | 89.7 | 46.0 | lstringa<16> copy{str_with_len_N};/256template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1498,8 +1498,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 28.1 | 27.8 | 85.7 | 90.7 | 130 | lstringa<16> copy{str_with_len_N};/512template<typename T>
+} | 28.3 | 27.5 | 90.0 | 89.5 | 56.1 | lstringa<16> copy{str_with_len_N};/512template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1507,8 +1507,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 30.7 | 31.0 | 87.1 | 89.3 | 116 | lstringa<16> copy{str_with_len_N};/1024template<typename T>
+} | 31.1 | 30.7 | 92.9 | 90.5 | 54.9 | lstringa<16> copy{str_with_len_N};/1024template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1516,8 +1516,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 52.9 | 55.0 | 96.6 | 101 | 139 | lstringa<16> copy{str_with_len_N};/2048template<typename T>
+} | 53.5 | 54.1 | 103 | 99.9 | 68.5 | lstringa<16> copy{str_with_len_N};/2048template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1525,8 +1525,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 67.6 | 64.4 | 125 | 125 | 178 | lstringa<16> copy{str_with_len_N};/4096template<typename T>
+} | 64.2 | 64.5 | 124 | 129 | 97.6 | lstringa<16> copy{str_with_len_N};/4096template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1534,8 +1534,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 87.8 | 90.0 | 180 | 190 | 221 | lstringa<512> copy{str_with_len_N};/15template<typename T>
+} | 90.2 | 87.1 | 188 | 189 | 143 | lstringa<512> copy{str_with_len_N};/15template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1543,8 +1543,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 1.58 | 1.13 | 1.45 | 4.82 | 8.09 | lstringa<512> copy{str_with_len_N};/16template<typename T>
+} | 1.50 | 1.13 | 1.47 | 4.41 | 4.74 | lstringa<512> copy{str_with_len_N};/16template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1552,8 +1552,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 4.90 | 4.48 | 5.21 | 9.21 | 21.2 | lstringa<512> copy{str_with_len_N};/23template<typename T>
+} | 4.92 | 4.86 | 5.24 | 9.33 | 16.3 | lstringa<512> copy{str_with_len_N};/23template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1561,8 +1561,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 4.83 | 4.49 | 5.18 | 9.42 | 20.4 | lstringa<512> copy{str_with_len_N};/24template<typename T>
+} | 4.88 | 4.79 | 5.28 | 9.47 | 16.0 | lstringa<512> copy{str_with_len_N};/24template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1570,8 +1570,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 4.78 | 4.10 | 5.21 | 9.49 | 20.3 | lstringa<512> copy{str_with_len_N};/32template<typename T>
+} | 4.60 | 4.73 | 5.18 | 9.35 | 16.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) {
@@ -1579,8 +1579,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 4.59 | 4.40 | 8.19 | 12.2 | 22.6 | lstringa<512> copy{str_with_len_N};/64template<typename T>
+} | 4.58 | 4.59 | 8.27 | 12.4 | 19.5 | lstringa<512> copy{str_with_len_N};/64template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1588,8 +1588,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 6.15 | 5.64 | 8.21 | 12.2 | 23.3 | lstringa<512> copy{str_with_len_N};/128template<typename T>
+} | 5.95 | 5.99 | 8.17 | 12.4 | 19.3 | lstringa<512> copy{str_with_len_N};/128template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1597,8 +1597,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 7.02 | 7.25 | 8.48 | 12.7 | 24.5 | lstringa<512> copy{str_with_len_N};/256template<typename T>
+} | 6.42 | 6.99 | 8.43 | 12.8 | 19.5 | lstringa<512> copy{str_with_len_N};/256template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1606,8 +1606,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 8.43 | 7.90 | 9.79 | 13.6 | 26.6 | lstringa<512> copy{str_with_len_N};/512template<typename T>
+} | 7.92 | 8.23 | 9.98 | 13.9 | 22.1 | lstringa<512> copy{str_with_len_N};/512template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1618,8 +1618,8 @@ void CopyDynString(benchmark::State& state) {
} | >> Даже 512 символов копируются быстрее, чем
одна аллокация или атомарный инкремент.
Even 512 characters are copied faster than a single
-allocation or atomic increment. | 11.5 | 10.4 | 11.2 | 15.4 | 28.5 | lstringa<512> copy{str_with_len_N};/1024template<typename T>
+allocation or atomic increment. | 10.3 | 10.4 | 11.2 | 15.6 | 23.7 | lstringa<512> copy{str_with_len_N};/1024template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1628,8 +1628,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(x);
}
} | >> А дальше уже как у всех.
-And then it's like everyone else. | 57.0 | 55.7 | 98.6 | 99.1 | 137 | lstringa<512> copy{str_with_len_N};/2048template<typename T>
+And then it's like everyone else. | 53.2 | 55.5 | 98.0 | 99.7 | 73.4 | lstringa<512> copy{str_with_len_N};/2048template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1637,8 +1637,8 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 65.8 | 66.5 | 124 | 127 | 174 | lstringa<512> copy{str_with_len_N};/4096template<typename T>
+} | 63.2 | 66.3 | 128 | 128 | 102 | lstringa<512> copy{str_with_len_N};/4096template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
for (auto _: state) {
@@ -1646,61 +1646,61 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | 92.2 | 89.3 | 182 | 191 | 220 | | 89.4 | 90.6 | 189 | 190 | 150 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-21 | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-13 | Xeon E5-2682 v4, Windows 10, Clang-19 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-21 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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
@@ -1719,8 +1719,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.2 | 27.1 | 31.8 | 31.5 | 201 | 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. | 27.4 | 27.8 | 31.3 | 31.8 | 91.8 | 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);
@@ -1735,8 +1735,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 | 12.1 | 13.3 | 11.9 | 2.16 | stringa s = "123456789"; int res = s.to_int<int, true, 10, false>template<typename T>
+signs, spaces, 0x prefixes, etc. | 12.9 | 11.3 | 13.6 | 12.0 | 0.732 | 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;
@@ -1752,8 +1752,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.58 | 8.79 | 13.4 | 16.5 | 61.4 | 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.54 | 7.94 | 13.4 | 17.3 | 18.7 | 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;
@@ -1766,8 +1766,8 @@ void ToIntSimStr10(benchmark::State& state, T t, int c) {
benchmark::DoNotOptimize(res);
benchmark::DoNotOptimize(t);
}
-} | 9.54 | 8.08 | 9.66 | 15.2 | 49.4 | lstringa<20> s = "123456789"; int res = s.to_int<int, true, 10, false>template<typename T>
+} | 9.23 | 8.54 | 12.5 | 15.4 | 17.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;
@@ -1780,18 +1780,18 @@ void ToIntSimStr10(benchmark::State& state, T t, int c) {
benchmark::DoNotOptimize(res);
benchmark::DoNotOptimize(t);
}
-} | 9.49 | 8.74 | 13.3 | 15.2 | 49.4 | | 9.45 | 7.90 | 13.4 | 14.8 | 17.0 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-21 | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-13 | Xeon E5-2682 v4, Windows 10, Clang-19 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-21 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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
@@ -1803,8 +1803,8 @@ void ToIntSimStr10(benchmark::State& state, T t, int c) {
benchmark::DoNotOptimize(res);
}
} | >> Всё то же, только для 16ричной системы
-Everything is the same, only for the hexadecimal system | 24.8 | 23.4 | 33.5 | 34.9 | 146 | 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 | 23.7 | 23.5 | 33.4 | 35.1 | 66.6 | 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);
@@ -1816,8 +1816,8 @@ Everything is the same, only for the hexadecimal system | 9.45 | 8.70 | 8.10 | 9.00 | 57.3 | stringa s = "abcDef"; int res = s.to_int<int, true, 16, false>template<typename T>
+} | 9.43 | 9.03 | 8.21 | 8.95 | 18.0 | 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;
@@ -1830,8 +1830,8 @@ void ToIntSimStr16(benchmark::State& state, T t, int c) {
benchmark::DoNotOptimize(res);
benchmark::DoNotOptimize(t);
}
-} | 7.81 | 8.52 | 12.5 | 14.4 | 60.0 | ssa s = "abcDef"; int res = s.to_int<int, true, 16, false>template<typename T>
+} | 7.59 | 7.93 | 12.3 | 14.5 | 17.9 | 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;
@@ -1844,8 +1844,8 @@ void ToIntSimStr16(benchmark::State& state, T t, int c) {
benchmark::DoNotOptimize(res);
benchmark::DoNotOptimize(t);
}
-} | 7.67 | 6.64 | 7.43 | 13.1 | 45.9 | lstringa<20> s = "abcDef"; int res = s.to_int<int, true, 16, false>template<typename T>
+} | 7.57 | 7.49 | 7.49 | 12.3 | 16.3 | 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;
@@ -1858,18 +1858,18 @@ void ToIntSimStr16(benchmark::State& state, T t, int c) {
benchmark::DoNotOptimize(res);
benchmark::DoNotOptimize(t);
}
-} | 7.71 | 8.72 | 11.8 | 12.6 | 46.3 | | 7.56 | 7.49 | 11.8 | 13.1 | 16.2 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-21 | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-13 | Xeon E5-2682 v4, Windows 10, Clang-19 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-21 | ||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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
@@ -1881,8 +1881,8 @@ void ToIntSimStr16(benchmark::State& state, T t, int c) {
benchmark::DoNotOptimize(res);
}
} | >> А здесь уже парсинг произвольного числа.
-And here we have parsing of an arbitrary number. | 30.3 | 29.0 | 43.8 | 47.5 | 208 | stringa s = " 123456789"; int res = s.to_int<int>; // Check overflowtemplate<typename T>
+And here we have parsing of an arbitrary number. | 28.5 | 29.2 | 44.0 | 46.9 | 106 | 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;
@@ -1895,8 +1895,8 @@ void ToIntSimStr0(benchmark::State& state, T t, int c) {
benchmark::DoNotOptimize(res);
benchmark::DoNotOptimize(t);
}
-} | 11.3 | 14.6 | 16.5 | 22.1 | 58.9 | ssa s = " 123456789"; int res = s.to_int<int, false>; // No check overflowvoid ToIntNoOverflow(benchmark::State& state, ssa t, int c) {
+} | 11.5 | 15.4 | 16.3 | 22.2 | 14.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
@@ -1908,16 +1908,16 @@ void ToIntSimStr0(benchmark::State& state, T t, int c) {
benchmark::DoNotOptimize(res);
benchmark::DoNotOptimize(t);
}
-} | 13.1 | 10.9 | 12.9 | 18.9 | 45.9 | | 13.3 | 13.5 | 13.0 | 18.8 | 15.5 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-21 | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-13 | Xeon E5-2682 v4, Windows 10, Clang-19 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-21 | |||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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);
@@ -1932,8 +1932,8 @@ void ToIntSimStr0(benchmark::State& state, T t, int c) {
#endif
benchmark::DoNotOptimize(res);
}
-} | 65.5 | 65.1 | 103 | 104 | 578 | std::string_view s = "1234.567e10"; std::from_chars(s.data(), s.data() + s.size(), res);void ToDoubleFromChars(benchmark::State& state, const std::string_view& s, double c) {
+} | 66.5 | 64.3 | 97.7 | 100 | 301 | std::string_view s = "1234.567e10"; std::from_chars(s.data(), s.data() + s.size(), res);void ToDoubleFromChars(benchmark::State& state, const std::string_view& s, double c) {
for (auto _: state) {
double res = 0;
if (std::from_chars(s.data(), s.data() + s.size(), res).ec != std::errc{}) {
@@ -1947,8 +1947,8 @@ void ToIntSimStr0(benchmark::State& state, T t, int c) {
#endif
benchmark::DoNotOptimize(res);
}
-} | 24.2 | 25.0 | 59.5 | 84.1 | 273 | ssa s = "1234.567e10"; double res = *s.to_double()template<typename T>
+} | 24.0 | 23.8 | 60.5 | 87.4 | 106 | 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>();
@@ -1965,16 +1965,16 @@ void ToDoubleSimStr(benchmark::State& state, T t, double c) {
benchmark::DoNotOptimize(res);
benchmark::DoNotOptimize(t);
}
-} | 26.4 | 24.4 | 35.5 | 37.8 | 93.8 | | 26.0 | 24.8 | 36.2 | 38.0 | 41.1 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-21 | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-13 | Xeon E5-2682 v4, Windows 10, Clang-19 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-21 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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;
@@ -1991,8 +1991,8 @@ void ToDoubleSimStr(benchmark::State& state, T t, double c) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(str);
}
-} | 1396 | 1375 | 4726 | 5627 | 15958 | std::string str; ... str += "abbaabbaabbaabba";void AppendStdStringConstLiteral(benchmark::State& state) {
+} | 1388 | 1348 | 4713 | 5729 | 6596 | std::string str; ... str += "abbaabbaabbaabba";void AppendStdStringConstLiteral(benchmark::State& state) {
for (auto _: state) {
std::string result;
for (size_t c = 0; c < 64; c++) {
@@ -2006,8 +2006,8 @@ void ToDoubleSimStr(benchmark::State& state, T t, double c) {
#endif
benchmark::DoNotOptimize(result);
}
-} | 375 | 350 | 1064 | 1313 | 1434 | lstringa<8> str; ... str += "abbaabbaabbaabba";template<unsigned N>
+} | 368 | 326 | 1083 | 1363 | 858 | lstringa<8> str; ... str += "abbaabbaabbaabba";template<unsigned N>
void AppendLstringConstLiteral(benchmark::State& state) {
for (auto _: state) {
lstringa<N> result;
@@ -2022,8 +2022,8 @@ void AppendLstringConstLiteral(benchmark::State& state) {
#endif
benchmark::DoNotOptimize(result);
}
-} | 369 | 338 | 793 | 942 | 1411 | lstringa<128> str; ... str += "abbaabbaabbaabba";template<unsigned N>
+} | 374 | 358 | 824 | 970 | 782 | lstringa<128> str; ... str += "abbaabbaabbaabba";template<unsigned N>
void AppendLstringConstLiteral(benchmark::State& state) {
for (auto _: state) {
lstringa<N> result;
@@ -2041,8 +2041,8 @@ void AppendLstringConstLiteral(benchmark::State& state) {
} | >> Чем больше внутренний буфер, тем меньше раз требуется
аллокация, тем быстрее результат.
The larger the internal buffer, the fewer allocations are
-required, and the faster the result. | 233 | 245 | 393 | 519 | 920 | lstringa<512> str; ... str += "abbaabbaabbaabba";template<unsigned N>
+required, and the faster the result. | 233 | 236 | 391 | 542 | 591 | lstringa<512> str; ... str += "abbaabbaabbaabba";template<unsigned N>
void AppendLstringConstLiteral(benchmark::State& state) {
for (auto _: state) {
lstringa<N> result;
@@ -2057,8 +2057,8 @@ void AppendLstringConstLiteral(benchmark::State& state) {
#endif
benchmark::DoNotOptimize(result);
}
-} | 238 | 217 | 259 | 370 | 638 | lstringa<1024> str; ... str += "abbaabbaabbaabba";template<unsigned N>
+} | 237 | 211 | 254 | 369 | 461 | lstringa<1024> str; ... str += "abbaabbaabbaabba";template<unsigned N>
void AppendLstringConstLiteral(benchmark::State& state) {
for (auto _: state) {
lstringa<N> result;
@@ -2073,19 +2073,19 @@ void AppendLstringConstLiteral(benchmark::State& state) {
#endif
benchmark::DoNotOptimize(result);
}
-} | 163 | 141 | 134 | 288 | 509 | | 163 | 140 | 134 | 230 | 372 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-21 | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-13 | Xeon E5-2682 v4, Windows 10, Clang-19 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-21 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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;
@@ -2103,8 +2103,8 @@ void AppendLstringConstLiteral(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(s1);
}
-} | 1370 | 1370 | 4556 | 6205 | 16329 | std::string str; ... str += str_var + "abbaabbaabbaabba";void AppendStdStrStrConstLiteral(benchmark::State& state) {
+} | 1478 | 1373 | 4606 | 5840 | 7324 | std::string str; ... str += str_var + "abbaabbaabbaabba";void AppendStdStrStrConstLiteral(benchmark::State& state) {
std::string p1 = TEXT_16;
for (auto _: state) {
std::string result;
@@ -2120,8 +2120,8 @@ void AppendLstringConstLiteral(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(p1);
}
-} | 1302 | 1238 | 3712 | 3832 | 4574 | lstringa<8> str; ... str += str_var + "abbaabbaabbaabba";template<unsigned N>
+} | 1286 | 1249 | 3825 | 3841 | 2429 | lstringa<8> str; ... str += str_var + "abbaabbaabbaabba";template<unsigned N>
void AppendLstringStrConstLiteral(benchmark::State& state) {
stringa p1 = TEXT_16;
for (auto _: state) {
@@ -2138,8 +2138,8 @@ void AppendLstringStrConstLiteral(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(p1);
}
-} | 415 | 405 | 716 | 841 | 1521 | lstringa<128> str; ... str += str_var + "abbaabbaabbaabba";template<unsigned N>
+} | 435 | 401 | 746 | 856 | 1035 | lstringa<128> str; ... str += str_var + "abbaabbaabbaabba";template<unsigned N>
void AppendLstringStrConstLiteral(benchmark::State& state) {
stringa p1 = TEXT_16;
for (auto _: state) {
@@ -2156,8 +2156,8 @@ void AppendLstringStrConstLiteral(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(p1);
}
-} | 339 | 339 | 444 | 525 | 1206 | lstringa<512> str; ... str += str_var + "abbaabbaabbaabba";template<unsigned N>
+} | 336 | 355 | 468 | 542 | 886 | lstringa<512> str; ... str += str_var + "abbaabbaabbaabba";template<unsigned N>
void AppendLstringStrConstLiteral(benchmark::State& state) {
stringa p1 = TEXT_16;
for (auto _: state) {
@@ -2174,8 +2174,8 @@ void AppendLstringStrConstLiteral(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(p1);
}
-} | 265 | 315 | 286 | 391 | 916 | lstringa<1024> str; ... str += str_var + "abbaabbaabbaabba";template<unsigned N>
+} | 280 | 300 | 303 | 391 | 745 | lstringa<1024> str; ... str += str_var + "abbaabbaabbaabba";template<unsigned N>
void AppendLstringStrConstLiteral(benchmark::State& state) {
stringa p1 = TEXT_16;
for (auto _: state) {
@@ -2192,19 +2192,19 @@ void AppendLstringStrConstLiteral(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(p1);
}
-} | 205 | 250 | 183 | 286 | 813 | | 214 | 249 | 184 | 288 | 685 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-21 | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-13 | Xeon E5-2682 v4, Windows 10, Clang-19 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-21 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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;
@@ -2222,8 +2222,8 @@ void AppendLstringStrConstLiteral(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(s1);
}
-} | 123086 | 125525 | 217525 | 285336 | 833815 | std::string str; ... str += str_var + "abbaabbaabbaabba"; 2048 timesvoid AppendStdStrStrConstLiteralBig(benchmark::State& state) {
+} | 119217 | 118986 | 224278 | 288424 | 367555 | std::string str; ... str += str_var + "abbaabbaabbaabba"; 2048 timesvoid AppendStdStrStrConstLiteralBig(benchmark::State& state) {
std::string p1 = TEXT_16;
for (auto _: state) {
std::string result;
@@ -2239,8 +2239,8 @@ void AppendLstringStrConstLiteral(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(p1);
}
-} | 73997 | 73243 | 191801 | 192976 | 241478 | lstringa<8> str; ... str += str_var + "abbaabbaabbaabba"; 2048 timestemplate<unsigned N>
+} | 72734 | 73469 | 192363 | 189131 | 128555 | lstringa<8> str; ... str += str_var + "abbaabbaabbaabba"; 2048 timestemplate<unsigned N>
void AppendLstringStrConstLiteralBig(benchmark::State& state) {
stringa p1 = TEXT_16;
for (auto _: state) {
@@ -2257,8 +2257,8 @@ void AppendLstringStrConstLiteralBig(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(p1);
}
-} | 46351 | 49189 | 19975 | 25665 | 57002 | lstringa<128> str; ... str += str_var + "abbaabbaabbaabba"; 2048 timestemplate<unsigned N>
+} | 46679 | 47566 | 20974 | 24955 | 51145 | lstringa<128> str; ... str += str_var + "abbaabbaabbaabba"; 2048 timestemplate<unsigned N>
void AppendLstringStrConstLiteralBig(benchmark::State& state) {
stringa p1 = TEXT_16;
for (auto _: state) {
@@ -2275,8 +2275,8 @@ void AppendLstringStrConstLiteralBig(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(p1);
}
-} | 27970 | 26787 | 16815 | 22282 | 56617 | lstringa<512> str; ... str += str_var + "abbaabbaabbaabba"; 2048 timestemplate<unsigned N>
+} | 28145 | 26208 | 16889 | 21987 | 48871 | lstringa<512> str; ... str += str_var + "abbaabbaabbaabba"; 2048 timestemplate<unsigned N>
void AppendLstringStrConstLiteralBig(benchmark::State& state) {
stringa p1 = TEXT_16;
for (auto _: state) {
@@ -2293,8 +2293,8 @@ void AppendLstringStrConstLiteralBig(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(p1);
}
-} | 19316 | 20894 | 16248 | 21972 | 53906 | lstringa<1024> str; ... str += str_var + "abbaabbaabbaabba"; 2048 timestemplate<unsigned N>
+} | 19090 | 20362 | 16287 | 22099 | 49022 | lstringa<1024> str; ... str += str_var + "abbaabbaabbaabba"; 2048 timestemplate<unsigned N>
void AppendLstringStrConstLiteralBig(benchmark::State& state) {
stringa p1 = TEXT_16;
for (auto _: state) {
@@ -2311,19 +2311,19 @@ void AppendLstringStrConstLiteralBig(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(p1);
}
-} | 15641 | 16956 | 16122 | 22145 | 55763 | | 16083 | 16214 | 16280 | 23376 | 47869 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-21 | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-13 | Xeon E5-2682 v4, Windows 10, Clang-19 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-21 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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) {
@@ -2343,8 +2343,8 @@ void AppendLstringStrConstLiteralBig(benchmark::State& state) {
benchmark::DoNotOptimize(s1);
benchmark::DoNotOptimize(s2);
}
-} | 1388 | 1440 | 4414 | 5300 | 15927 | std::string str; ... str += str_var1 + str_var2;void AppendStdStr2String(benchmark::State& state) {
+} | 1398 | 1401 | 4491 | 5471 | 7371 | std::string str; ... str += str_var1 + str_var2;void AppendStdStr2String(benchmark::State& state) {
std::string s1 = TEXT_16;
std::string s2 = TEXT_16;
@@ -2363,8 +2363,8 @@ void AppendLstringStrConstLiteralBig(benchmark::State& state) {
benchmark::DoNotOptimize(s1);
benchmark::DoNotOptimize(s2);
}
-} | 1441 | 1374 | 3894 | 3964 | 4954 | lstringa<16> str; ... str += str_var1 + str_var2;template<unsigned N>
+} | 1396 | 1418 | 4048 | 4091 | 2705 | lstringa<16> str; ... str += str_var1 + str_var2;template<unsigned N>
void AppendLstring2String(benchmark::State& state) {
stra s1 = TEXT_16;
stra s2 = TEXT_16;
@@ -2383,8 +2383,8 @@ void AppendLstring2String(benchmark::State& state) {
benchmark::DoNotOptimize(s1);
benchmark::DoNotOptimize(s2);
}
-} | 500 | 476 | 791 | 909 | 1852 | lstringa<128> str; ... str += str_var1 + str_var2;template<unsigned N>
+} | 489 | 484 | 813 | 933 | 1272 | lstringa<128> str; ... str += str_var1 + str_var2;template<unsigned N>
void AppendLstring2String(benchmark::State& state) {
stra s1 = TEXT_16;
stra s2 = TEXT_16;
@@ -2403,8 +2403,8 @@ void AppendLstring2String(benchmark::State& state) {
benchmark::DoNotOptimize(s1);
benchmark::DoNotOptimize(s2);
}
-} | 401 | 416 | 523 | 624 | 1497 | lstringa<512> str; ... str += str_var1 + str_var2;template<unsigned N>
+} | 404 | 418 | 526 | 641 | 1198 | lstringa<512> str; ... str += str_var1 + str_var2;template<unsigned N>
void AppendLstring2String(benchmark::State& state) {
stra s1 = TEXT_16;
stra s2 = TEXT_16;
@@ -2423,8 +2423,8 @@ void AppendLstring2String(benchmark::State& state) {
benchmark::DoNotOptimize(s1);
benchmark::DoNotOptimize(s2);
}
-} | 370 | 368 | 394 | 476 | 1196 | lstringa<1024> str; ... str += str_var1 + str_var2;template<unsigned N>
+} | 374 | 371 | 398 | 483 | 1033 | lstringa<1024> str; ... str += str_var1 + str_var2;template<unsigned N>
void AppendLstring2String(benchmark::State& state) {
stra s1 = TEXT_16;
stra s2 = TEXT_16;
@@ -2443,19 +2443,19 @@ void AppendLstring2String(benchmark::State& state) {
benchmark::DoNotOptimize(s1);
benchmark::DoNotOptimize(s2);
}
-} | 302 | 316 | 288 | 367 | 1089 | | 292 | 320 | 295 | 389 | 960 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-21 | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-13 | Xeon E5-2682 v4, Windows 10, Clang-19 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-21 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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;
@@ -2471,8 +2471,8 @@ void AppendLstring2String(benchmark::State& state) {
benchmark::DoNotOptimize(k);
}
}
-} | 3023 | 3250 | 11096 | 11879 | 25783 | std::string str = "test = " + std::to_string(k) + " times";void AppendStdStringStrNumStr(benchmark::State& state) {
+} | 3075 | 3267 | 10555 | 12668 | 11807 | 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";
@@ -2486,8 +2486,8 @@ void AppendLstring2String(benchmark::State& state) {
benchmark::DoNotOptimize(k);
}
}
-} | 443 | 428 | 1066 | 1691 | 3681 | char buf[100]; sprintf(buf, "test = %u times", k); std::string str = buf;void AppendSprintfStrNumStr(benchmark::State& state) {
+} | 444 | 434 | 1061 | 1270 | 1850 | 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];
@@ -2503,8 +2503,8 @@ void AppendLstring2String(benchmark::State& state) {
benchmark::DoNotOptimize(k);
}
}
-} | 1337 | 1489 | 2788 | 2823 | 10716 | std::string str = std::format("test = {} times", k);void AppendFormatStrNumStr(benchmark::State& state) {
+} | 1377 | 1519 | 2843 | 2806 | 5459 | 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);
@@ -2518,8 +2518,8 @@ void AppendLstring2String(benchmark::State& state) {
benchmark::DoNotOptimize(k);
}
}
-} | 1174 | 1458 | 1845 | 2332 | 5711 | lstringa<8> str; str.format("test = {} times", k);template<typename T>
+} | 1125 | 1497 | 1908 | 2376 | 2886 | 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) {
@@ -2537,8 +2537,8 @@ void AppendSimStrStrNumStrF(benchmark::State& state) {
}
} | >> В simstr format с первого раза не помещается в такую строку без аллокации.
In simstr format, the first time it doesn't fit into such a
-string without allocation. | 1348 | 1574 | 2035 | 2730 | 8447 | lstringa<32> str; str.format("test = {} times", k);template<typename T>
+string without allocation. | 1386 | 1586 | 2056 | 2630 | 4975 | 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) {
@@ -2555,8 +2555,8 @@ void AppendSimStrStrNumStrF(benchmark::State& state) {
}
}
} | >> А в такую помещается. Используйте сразу буфера подходящего размера.
-And it fits in this one. Use buffers of the appropriate size right away. | 984 | 1098 | 965 | 1530 | 7294 | lstringa<8> str = "test = " + k + " times";template<typename T>
+And it fits in this one. Use buffers of the appropriate size right away. | 1021 | 1126 | 1029 | 1546 | 4261 | 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) {
@@ -2572,8 +2572,8 @@ void AppendSimStrStrNumStr(benchmark::State& state) {
}
}
} | >> Результат не помещается в SSO, возникает аллокация.
-The result does not fit into SSO, an allocation occurs. | 286 | 303 | 821 | 938 | 1418 | lstringa<32> str = "test = " + k + " times";template<typename T>
+The result does not fit into SSO, an allocation occurs. | 282 | 315 | 832 | 925 | 592 | 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) {
@@ -2591,8 +2591,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. | 129 | 148 | 142 | 171 | 572 | stringa str = "test = " + k + " times";template<typename T>
+Once again, use appropriately sized buffers from the start. | 127 | 154 | 138 | 173 | 376 | 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) {
@@ -2610,22 +2610,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. | 133 | 137 | 122 | 174 | 1197 | | 123 | 133 | 123 | 180 | 573 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-21 | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-13 | Xeon E5-2682 v4, Windows 10, Clang-19 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-21 | ||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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;
@@ -2647,8 +2647,8 @@ enough to accommodate the result, hence the long time. | 259 | 279 | 544 | 545 | 1443 | ssa::splitter + ssa::as_intvoid SplitConvertIntSimStr(benchmark::State& state) {
+} | 265 | 265 | 549 | 556 | 693 | ssa::splitter + ssa::as_intvoid SplitConvertIntSimStr(benchmark::State& state) {
stra numbers = NUMBER_LIST;
for (auto _: state) {
int total = 0;
@@ -2664,8 +2664,8 @@ enough to accommodate the result, hence the long time. | 157 | 134 | 165 | 298 | 595 | ssa::splitf + functorvoid SplitConvertIntSplitf(benchmark::State& state) {
+} | 155 | 143 | 164 | 302 | 240 | ssa::splitf + functorvoid SplitConvertIntSplitf(benchmark::State& state) {
stra numbers = NUMBER_LIST;
for (auto _: state) {
int total = 0;
@@ -2679,16 +2679,16 @@ enough to accommodate the result, hence the long time. | 210 | 139 | 190 | 214 | 853 | | 206 | 125 | 188 | 216 | 281 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-21 | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-13 | Xeon E5-2682 v4, Windows 10, Clang-19 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-21 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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"
@@ -2745,8 +2745,8 @@ enough to accommodate the result, hence the long time. | 'b' and 'b'->'a'. But if the substitutions don't conflict,
-it works quickly. | 881 | 1153 | 1093 | 1191 | 4959 | replace symbols with std::string find_first_of + replacevoid ReplaceSymbolsStdStringNaiveRight(benchmark::State& state) {
+it works quickly. | 841 | 837 | 1161 | 1259 | 2875 | 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"
@@ -2800,8 +2800,8 @@ it works quickly. | 881 | >> Дальше уже правильные реализации, не зависящие от конфликтующих замен.
Further, there are correct implementations that do not depend on
-conflicting replacements. | 2480 | 2567 | 2049 | 2209 | 9947 | replace symbols with std::string_view find_first_of + copyvoid ReplaceSymbolsStdString(benchmark::State& state) {
+conflicting replacements. | 2450 | 2361 | 2012 | 2262 | 5461 | 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"
@@ -2852,8 +2852,8 @@ conflicting replacements. | 2480 | 1093 | 959 | 2329 | 2598 | 4617 | replace runtime symbols with string expressions and without remembering all search resultstemplate<bool UseVector>
+} | 1078 | 965 | 2385 | 2618 | 3004 | 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 >"
@@ -2898,8 +2898,8 @@ void ReplaceSymbolsDynPatternSimStr(benchmark::State& state) {
benchmark::DoNotOptimize(source);
benchmark::DoNotOptimize(repl);
}
-} | 1265 | 1461 | 1454 | 1546 | 4256 | replace runtime symbols with simstr and memorization of all search resultstemplate<bool UseVector>
+} | 1274 | 1436 | 1607 | 1689 | 2942 | 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 >"
@@ -2944,8 +2944,8 @@ void ReplaceSymbolsDynPatternSimStr(benchmark::State& state) {
benchmark::DoNotOptimize(source);
benchmark::DoNotOptimize(repl);
}
-} | 1114 | 1209 | 1257 | 1349 | 3810 | replace const symbols with string expressions and without remembering all search resultstemplate<bool UseVector>
+} | 1053 | 1067 | 1371 | 1490 | 2367 | 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 >"
@@ -2987,8 +2987,8 @@ void ReplaceSymbolsCons2PatternSimStr(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 1098 | 1207 | 1136 | 1272 | 3231 | replace const symbols with string expressions and memorization of all search resultstemplate<bool UseVector>
+} | 1009 | 1246 | 1229 | 1255 | 2442 | 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 >"
@@ -3030,20 +3030,20 @@ void ReplaceSymbolsCons2PatternSimStr(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 837 | 854 | 1188 | 1283 | 3050 | | 883 | 850 | 1149 | 1217 | 2031 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-21 | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-13 | Xeon E5-2682 v4, Windows 10, Clang-19 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-21 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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 >"
;
@@ -3081,8 +3081,8 @@ void ReplaceSymbolsCons2PatternSimStr(benchmark::State& state) {
benchmark::DoNotOptimize(source);
benchmark::DoNotOptimize(repl);
}
-} | 162 | 162 | 307 | 332 | 889 | Short replace symbols with std::string find_first_of + replacevoid ShortReplaceSymbolsStdStringNaiveRight(benchmark::State& state) {
+} | 165 | 158 | 307 | 330 | 516 | Short replace symbols with std::string find_first_of + replacevoid ShortReplaceSymbolsStdStringNaiveRight(benchmark::State& state) {
std::string_view source =
"abcdefg124 < jhsfjsh sjdfsh jfhjd && jdjdj >"
;
@@ -3120,8 +3120,8 @@ void ReplaceSymbolsCons2PatternSimStr(benchmark::State& state) {
benchmark::DoNotOptimize(source);
benchmark::DoNotOptimize(repl);
}
-} | 321 | 333 | 361 | 419 | 1379 | Short replace symbols with std::string_view find_first_of + copyvoid ShortReplaceSymbolsStdString(benchmark::State& state) {
+} | 318 | 338 | 358 | 423 | 774 | Short replace symbols with std::string_view find_first_of + copyvoid ShortReplaceSymbolsStdString(benchmark::State& state) {
std::string_view source =
"abcdefg124 < jhsfjsh sjdfsh jfhjd && jdjdj >"
;
@@ -3158,8 +3158,8 @@ void ReplaceSymbolsCons2PatternSimStr(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 159 | 168 | 315 | 344 | 804 | Short replace runtime symbols with string expressions and without remembering all search resultstemplate<bool UseVector>
+} | 152 | 160 | 313 | 350 | 439 | 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 >"
@@ -3190,8 +3190,8 @@ void ShortReplaceSymbolsDynPatternSimStr(benchmark::State& state) {
benchmark::DoNotOptimize(source);
benchmark::DoNotOptimize(repl);
}
-} | 181 | 185 | 242 | 299 | 645 | Short replace runtime symbols with simstr and memorization of all search resultstemplate<bool UseVector>
+} | 163 | 204 | 276 | 312 | 389 | 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 >"
@@ -3222,8 +3222,8 @@ void ShortReplaceSymbolsDynPatternSimStr(benchmark::State& state) {
benchmark::DoNotOptimize(source);
benchmark::DoNotOptimize(repl);
}
-} | 293 | 209 | 338 | 380 | 770 | Short replace const symbols with string expressions and without remembering all search resultstemplate<bool UseVector>
+} | 187 | 193 | 345 | 418 | 439 | 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 >"
@@ -3251,8 +3251,8 @@ void ShortReplaceSymbolsCons2PatternSimStr(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 130 | 147 | 195 | 243 | 438 | Short replace const symbols with string expressions and memorization of all search resultstemplate<bool UseVector>
+} | 126 | 150 | 212 | 252 | 292 | 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 >"
@@ -3280,20 +3280,20 @@ void ShortReplaceSymbolsCons2PatternSimStr(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 139 | 134 | 309 | 344 | 577 | | 147 | 140 | 294 | 325 | 320 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-21 | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-13 | Xeon E5-2682 v4, Windows 10, Clang-19 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-21 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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";
@@ -3325,8 +3325,8 @@ void ReplaceAllLongerStdString(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | 153 | 159 | 216 | 239 | 776 | replace bb to ---- in std::string|256template<size_t Long>
+} | 152 | 157 | 219 | 239 | 394 | 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";
@@ -3358,8 +3358,8 @@ void ReplaceAllLongerStdString(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | 553 | 502 | 734 | 791 | 2406 | replace bb to ---- in std::string|512template<size_t Long>
+} | 538 | 492 | 750 | 796 | 1197 | 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";
@@ -3391,8 +3391,8 @@ void ReplaceAllLongerStdString(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | 1093 | 995 | 1372 | 1460 | 4112 | replace bb to ---- in std::string|1024template<size_t Long>
+} | 1070 | 990 | 1352 | 1522 | 2361 | 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";
@@ -3424,8 +3424,8 @@ void ReplaceAllLongerStdString(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | 2427 | 2262 | 2999 | 3181 | 9118 | replace bb to ---- in std::string|2048template<size_t Long>
+} | 2384 | 2325 | 3028 | 3121 | 4872 | 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";
@@ -3457,8 +3457,8 @@ void ReplaceAllLongerStdString(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | 5988 | 6071 | 7578 | 7842 | 19199 | replace bb to ---- in lstringa<8>|64template<size_t N, size_t Count>
+} | 6072 | 6064 | 7680 | 7894 | 11862 | 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";
@@ -3479,8 +3479,8 @@ void ReplaceAllLongerSimString(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 129 | 138 | 214 | 225 | 620 | replace bb to ---- in lstringa<8>|256template<size_t N, size_t Count>
+} | 129 | 145 | 217 | 230 | 306 | 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";
@@ -3501,8 +3501,8 @@ void ReplaceAllLongerSimString(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 433 | 475 | 605 | 653 | 1900 | replace bb to ---- in lstringa<8>|512template<size_t N, size_t Count>
+} | 430 | 475 | 609 | 671 | 953 | 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";
@@ -3523,8 +3523,8 @@ void ReplaceAllLongerSimString(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 786 | 893 | 1028 | 1086 | 3505 | replace bb to ---- in lstringa<8>|1024template<size_t N, size_t Count>
+} | 825 | 862 | 1052 | 1119 | 1732 | 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";
@@ -3545,8 +3545,8 @@ void ReplaceAllLongerSimString(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 1611 | 1660 | 1795 | 2002 | 6338 | replace bb to ---- in lstringa<8>|2048template<size_t N, size_t Count>
+} | 1613 | 1756 | 1878 | 2032 | 3256 | 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";
@@ -3567,8 +3567,8 @@ void ReplaceAllLongerSimString(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 3063 | 3247 | 3547 | 3792 | 12720 | replace bb to ---- by init stringa|64template<size_t Count>
+} | 3174 | 3286 | 3548 | 3867 | 6323 | replace bb to ---- by init stringa|64template<size_t Count>
void ReplaceAllLongerSimStringExpr(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
ssa sample = "aaaaaaaaaaaaaaaaaaa----baaaaaaaa--------aaaaabaaaaaaaaaaaaaaaaaaaaa----a";
@@ -3588,8 +3588,8 @@ void ReplaceAllLongerSimStringExpr(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 91.6 | 84.8 | 168 | 195 | 379 | replace bb to ---- by init stringa|256template<size_t Count>
+} | 94.5 | 87.1 | 162 | 200 | 162 | replace bb to ---- by init stringa|256template<size_t Count>
void ReplaceAllLongerSimStringExpr(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
ssa sample = "aaaaaaaaaaaaaaaaaaa----baaaaaaaa--------aaaaabaaaaaaaaaaaaaaaaaaaaa----a";
@@ -3609,8 +3609,8 @@ void ReplaceAllLongerSimStringExpr(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 309 | 282 | 362 | 461 | 1126 | replace bb to ---- by init stringa|512template<size_t Count>
+} | 299 | 267 | 363 | 463 | 527 | replace bb to ---- by init stringa|512template<size_t Count>
void ReplaceAllLongerSimStringExpr(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
ssa sample = "aaaaaaaaaaaaaaaaaaa----baaaaaaaa--------aaaaabaaaaaaaaaaaaaaaaaaaaa----a";
@@ -3630,8 +3630,8 @@ void ReplaceAllLongerSimStringExpr(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 700 | 674 | 824 | 1061 | 2808 | replace bb to ---- by init stringa|1024template<size_t Count>
+} | 696 | 651 | 789 | 1075 | 1213 | replace bb to ---- by init stringa|1024template<size_t Count>
void ReplaceAllLongerSimStringExpr(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
ssa sample = "aaaaaaaaaaaaaaaaaaa----baaaaaaaa--------aaaaabaaaaaaaaaaaaaaaaaaaaa----a";
@@ -3651,8 +3651,8 @@ void ReplaceAllLongerSimStringExpr(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 1592 | 1535 | 1578 | 2174 | 5776 | replace bb to ---- by init stringa|2048template<size_t Count>
+} | 1546 | 1455 | 1587 | 2167 | 2565 | replace bb to ---- by init stringa|2048template<size_t Count>
void ReplaceAllLongerSimStringExpr(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
ssa sample = "aaaaaaaaaaaaaaaaaaa----baaaaaaaa--------aaaaabaaaaaaaaaaaaaaaaaaaaa----a";
@@ -3672,28 +3672,28 @@ void ReplaceAllLongerSimStringExpr(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 3230 | 3000 | 3172 | 4494 | 12197 | | 3176 | 2933 | 2912 | 4357 | 5315 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-21 | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-13 | Xeon E5-2682 v4, Windows 10, Clang-19 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-21 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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";
@@ -3724,8 +3724,8 @@ void ReplaceAllEqualStdString(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | 107 | 115 | 180 | 193 | 557 | replace bb to -- in std::string|256template<size_t Long>
+} | 106 | 111 | 181 | 201 | 256 | 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";
@@ -3756,8 +3756,8 @@ void ReplaceAllEqualStdString(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | 376 | 408 | 468 | 514 | 1747 | replace bb to -- in std::string|512template<size_t Long>
+} | 382 | 366 | 480 | 517 | 819 | 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";
@@ -3788,8 +3788,8 @@ void ReplaceAllEqualStdString(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | 745 | 702 | 862 | 936 | 3241 | replace bb to -- in std::string|1024template<size_t Long>
+} | 724 | 738 | 826 | 924 | 1546 | 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";
@@ -3820,8 +3820,8 @@ void ReplaceAllEqualStdString(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | 1481 | 1454 | 1609 | 1727 | 6280 | replace bb to -- in std::string|2048template<size_t Long>
+} | 1457 | 1431 | 1598 | 1771 | 2954 | 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";
@@ -3852,8 +3852,8 @@ void ReplaceAllEqualStdString(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | 2855 | 2708 | 3098 | 3417 | 12918 | replace bb to -- in lstringa<8>|64template<size_t N, size_t Long>
+} | 2855 | 2775 | 3822 | 3511 | 5749 | 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";
@@ -3873,8 +3873,8 @@ void ReplaceAllEqualSimString(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 94.5 | 92.0 | 177 | 186 | 466 | replace bb to -- in lstringa<8>|256template<size_t N, size_t Long>
+} | 94.1 | 95.4 | 174 | 189 | 206 | 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";
@@ -3894,8 +3894,8 @@ void ReplaceAllEqualSimString(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 290 | 302 | 453 | 435 | 1429 | replace bb to -- in lstringa<8>|512template<size_t N, size_t Long>
+} | 282 | 282 | 429 | 434 | 650 | 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";
@@ -3915,8 +3915,8 @@ void ReplaceAllEqualSimString(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 554 | 541 | 797 | 783 | 2538 | replace bb to -- in lstringa<8>|1024template<size_t N, size_t Long>
+} | 520 | 531 | 733 | 779 | 1202 | 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";
@@ -3936,8 +3936,8 @@ void ReplaceAllEqualSimString(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 1047 | 1033 | 1460 | 1432 | 4898 | replace bb to -- in lstringa<8>|2048template<size_t N, size_t Long>
+} | 1069 | 1029 | 1377 | 1465 | 2364 | 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";
@@ -3957,8 +3957,8 @@ void ReplaceAllEqualSimString(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | 2056 | 2000 | 2850 | 2808 | 9438 | replace bb to -- by init stringa|64template<size_t Count>
+} | 2100 | 2008 | 2655 | 2810 | 4378 | replace bb to -- by init stringa|64template<size_t Count>
void ReplaceAllEqualSimStringExpr(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
ssa sample = "aaaaaaaaaaaaaaaaaaa--baaaaaaaa----aaaaabaaaaaaaaaaaaaaaaaaaaa--a";
@@ -3982,8 +3982,8 @@ void ReplaceAllEqualSimStringExpr(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | 76.9 | 82.3 | 149 | 163 | 318 | replace bb to -- by init stringa|256template<size_t Count>
+} | 76.1 | 83.6 | 150 | 166 | 147 | replace bb to -- by init stringa|256template<size_t Count>
void ReplaceAllEqualSimStringExpr(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
ssa sample = "aaaaaaaaaaaaaaaaaaa--baaaaaaaa----aaaaabaaaaaaaaaaaaaaaaaaaaa--a";
@@ -4007,8 +4007,8 @@ void ReplaceAllEqualSimStringExpr(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | 238 | 264 | 327 | 368 | 958 | replace bb to -- by init stringa|512template<size_t Count>
+} | 234 | 265 | 325 | 375 | 472 | replace bb to -- by init stringa|512template<size_t Count>
void ReplaceAllEqualSimStringExpr(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
ssa sample = "aaaaaaaaaaaaaaaaaaa--baaaaaaaa----aaaaabaaaaaaaaaaaaaaaaaaaaa--a";
@@ -4032,8 +4032,8 @@ void ReplaceAllEqualSimStringExpr(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | 428 | 571 | 518 | 634 | 1814 | replace bb to -- by init stringa|1024template<size_t Count>
+} | 439 | 501 | 519 | 621 | 912 | replace bb to -- by init stringa|1024template<size_t Count>
void ReplaceAllEqualSimStringExpr(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
ssa sample = "aaaaaaaaaaaaaaaaaaa--baaaaaaaa----aaaaabaaaaaaaaaaaaaaaaaaaaa--a";
@@ -4057,8 +4057,8 @@ void ReplaceAllEqualSimStringExpr(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | 858 | 1012 | 979 | 1114 | 3500 | replace bb to -- by init stringa|2048template<size_t Count>
+} | 854 | 1004 | 1010 | 1112 | 1712 | replace bb to -- by init stringa|2048template<size_t Count>
void ReplaceAllEqualSimStringExpr(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
ssa sample = "aaaaaaaaaaaaaaaaaaa--baaaaaaaa----aaaaabaaaaaaaaaaaaaaaaaaaaa--a";
@@ -4082,28 +4082,28 @@ void ReplaceAllEqualSimStringExpr(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | 1634 | 1962 | 1812 | 2145 | 6788 | | 1646 | 1944 | 1741 | 2125 | 2832 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-21 | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-13 | Xeon E5-2682 v4, Windows 10, Clang-19 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-21 | |||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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++) {
@@ -4128,8 +4128,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. | 3603351 | 3720383 | 3947744 | 4396542 | 5109286 | std::unordered_map<std::string, size_t> emplace & find std::string;void HashMapStdStr(benchmark::State& state) {
+hashStrMapA, and then search for them in it. | 3606014 | 3698007 | 4020366 | 4428253 | 3227313 | 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++) {
@@ -4152,8 +4152,8 @@ hashStrMapA, and then search for them in it. | >> То же самое c std::string и std::unordered_map
-Same thing with std::string and std::unordered_map | 3597828 | 3743420 | 5668217 | 5663611 | 6102064 | hashStrMapA<size_t> emplace & find ssa;void HashMapSimSsa(benchmark::State& state) {
+Same thing with std::string and std::unordered_map | 3523575 | 3645916 | 5598760 | 5898002 | 3640106 | 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++) {
@@ -4177,8 +4177,8 @@ Same thing with std::string and std::unordered_map | >> Теперь вставляем stringa, а ищем ssa
-Now we insert stringa and search for ssa | 3647053 | 3829722 | 3479075 | 3927354 | 5120455 | 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 | 3593513 | 3708079 | 3439706 | 4082178 | 3237505 | 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++) {
@@ -4202,17 +4202,17 @@ Now we insert stringa and search for ssa | >> Вставляем std::string, а ищем std::string_view
-We insert std::string and look for std::string_view | 4111005 | 3934639 | 6415411 | 6453271 | 7370000 | | 4068399 | 4189102 | 7068855 | 6303534 | 4135414 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-21 | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-13 | Xeon E5-2682 v4, Windows 10, Clang-19 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-21 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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;
@@ -4249,8 +4249,8 @@ We insert std::string and look for std::string_view | 674 | 871 | 1503 | 1582 | 5735 | Build func full name std::string 1;std::string build_full_name_std1() const {
+return values. The algorithm uses std::string. | 678 | 853 | 1506 | 1604 | 3605 | 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 + "(";
@@ -4281,8 +4281,8 @@ return values. The algorithm uses std::string. | >> Почти тот же алгоритм, но несколько последовательных
+= к строке заменены на одно += + + +.
Almost the same algorithm, but several consecutive
-+= to a string are replaced with a single += + + +. | 795 | 910 | 1585 | 1666 | 6226 | Build func full name std::stream;std::string build_full_name_stream() const {
++= to a string are replaced with a single += + + +. | 776 | 912 | 1582 | 1697 | 3610 | Build func full name std::stream;std::string build_full_name_stream() const {
std::ostringstream str;
if (has_ret_type_resolver) {
str << "any";
@@ -4315,8 +4315,8 @@ Almost the same algorithm, but several consecutive
str << ")";
return str.str();
} | >> Строим имя функции через std::ostringstream и <<
-We construct the function name through std::ostringstream and << | 2574 | 2633 | 8326 | 9706 | 25795 | Build func full name stringa;stringa build_full_name() const {
+We construct the function name through std::ostringstream and << | 2611 | 2502 | 8167 | 10054 | 12391 | 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;
@@ -4333,8 +4333,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. | 485 | 451 | 760 | 871 | 2962 | Build func full name stringa 1;stringa build_full_name1() const {
+Parameter information is appended to the current line. | 484 | 459 | 790 | 879 | 1610 | 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;
@@ -4351,18 +4351,18 @@ Parameter information is appended to the current line. | 608 | 656 | 864 | 956 | 3450 | | 610 | 627 | 877 | 982 | 1874 |
| Benchmark name | Comment | Xeon E5-2682 v4, Ubuntu 22 (WSL), Clang-21 | Xeon E5-2682 v4, Ubuntu 22 (WSL), GCC-13 | Xeon E5-2682 v4, Windows 10, Clang-19 | Xeon E5-2682 v4, Windows 10, MSVC-19 | Xeon E5-2682 v4, WASM Chrome 143, Clang-21 | |||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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) {
@@ -4380,8 +4380,8 @@ to be written in a single string, but is slightly slower in execution time. | 151 | 165 | 1522 | 1452 | 1276 | To upper case lstringw<15>void UpperCaseSim(benchmark::State& state) {
+} | 151 | 166 | 1526 | 1424 | 203 | To upper case lstringw<15>void UpperCaseSim(benchmark::State& state) {
for (auto _: state) {
lstringw<15> test = L"TestПриветTest";
benchmark::DoNotOptimize(test);
@@ -4395,8 +4395,8 @@ to be written in a single string, but is slightly slower in execution time. | 42.7 | 45.1 | 38.3 | 44.5 | 132 | | 41.4 | 42.0 | 40.3 | 50.5 | 63.5 |