diff --git a/CMakeLists.txt b/CMakeLists.txt index 7065b93..207d9c8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,7 @@ include(FetchContent) project( simstr - VERSION 1.6.7 + VERSION 1.7.0 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 7eb19e0..e6c56b6 100644 --- a/bench/bench_str.cpp +++ b/bench/bench_str.cpp @@ -1,5 +1,5 @@ /* - * ver. 1.6.7 + * ver. 1.7.0 * (c) Проект "SimStr", Александр Орефков orefkov@gmail.com * Бенчмарки * (c) Project "SimStr", Aleksandr Orefkov orefkov@gmail.com @@ -2607,6 +2607,46 @@ BENCHMARK(BuildFuncNameStream) ->Name("Build func full name std::stream; BENCHMARK(BuildFuncNameSimStr) ->Name("Build func full name stringa;"); BENCHMARK(BuildFuncNameSimStr1) ->Name("Build func full name stringa 1;"); +void UpperCaseStd(benchmark::State& state) { + static const auto& loc = std::locale("en_US.utf8"); + + for (auto _: state) { + std::wstring test = L"TestПриветTest"; + benchmark::DoNotOptimize(test); + + std::transform(test.begin(), test.end(), test.begin(), [](wchar_t s) { + return std::toupper(s, loc); + }); + + benchmark::DoNotOptimize(test); + #ifdef CHECK_RESULT + if (test != L"TESTПРИВЕТTEST") { + state.SkipWithError("Bad upper case"); + } + #endif + } +} + +void UpperCaseSim(benchmark::State& state) { + for (auto _: state) { + lstringw<15> test = L"TestПриветTest"; + benchmark::DoNotOptimize(test); + + test.upper(); + + benchmark::DoNotOptimize(test); + #ifdef CHECK_RESULT + if (test != L"TESTПРИВЕТTEST") { + state.SkipWithError("Bad upper case"); + } + #endif + } +} + +BENCHMARK(__)->Name("----- Make Upper ---------")->Repetitions(1); +BENCHMARK(UpperCaseStd)->Name("To upper case std::wstring"); +BENCHMARK(UpperCaseSim)->Name("To upper case lstringw<15>"); + int main(int argc, char** argv) { std::cout << "Benchmarks of simstr, version " SIMSTR_VERSION << "\n" << "Sources: https://github.com/orefkov/simstr\n" diff --git a/bench/emscripten/shell_minimal.html b/bench/emscripten/shell_minimal.html index f99ad2c..34b5557 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);
-} | 163 | 177 | 203 | 259 | 964 | Concat email std::stringstreamstd::string email_concat_stream(std::string_view name, std::string_view domain, std::string_view 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) {
std::stringstream s;
s << name << "@" << domain << "." << tld;
return s.str();
-} | 322 | 328 | 792 | 898 | 2458 | Concat email stringzilla appendsz::string email_concat_stringzilla_app(sz::string name, sz::string_view domain, sz::string_view tld) {
+} | 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) {
return name.append("@").append(domain).append(".").append(tld);
-} | 133 | 115 | 268 | 282 | 594 | Concat email stringzilla concatsz::string email_concat_stringzilla_exp(sz::string name, sz::string_view domain, sz::string_view 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) {
return sz::string{name | sz::string_view{"@"} | domain | sz::string_view{"."} | tld};
} | >> В stringzilla тоже есть конкатенация строковыми выражениями, но не
так удобна и развита, как в simstr.
Stringzilla also has concatenation by expression templates,
-but it's not as convenient or advanced as simstr. | 54.9 | 48.3 | 126 | 131 | 213 | 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.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) {
return name.append("@").append(domain).append(".").append(tld);
-} | 72.1 | 96.7 | 189 | 198 | 623 | 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 | 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) {
return +name + "@" + domain + "." + tld;
-} | 44.3 | 33.5 | 108 | 106 | 158 | Concat email stringastringa email_concat_sim_expr(ssa name, ssa domain, ssa tld) {
+} | 43.5 | 37.6 | 113 | 112 | 159 | Concat email stringastringa email_concat_sim_expr(ssa name, ssa domain, ssa tld) {
return name + "@" + domain + "." + tld;
-} | 39.9 | 40.3 | 92.7 | 103 | 124 | | 38.9 | 40.9 | 96.2 | 98.1 | 133 |
| 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. | 214 | 224 | 273 | 320 | 1831 | Concat std::string and number by StrExpr to std::stringvoid ConcatSimToStd(benchmark::State& state) {
+} | 220 | 223 | 271 | 314 | 1951 | 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. | 103 | 100 | 152 | 212 | 947 | Concat stringa and number by StrExpr to simstr::stringavoid ConcatSimToSim(benchmark::State& state) {
+} | 104 | 102 | 162 | 206 | 974 | 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. | 63.0 | 72.8 | 70.1 | 107 | 354 | Concat stringa and number by e_concat to simstr::stringavoid ConcatSimToSimConcat(benchmark::State& state) {
+while in stringa , the entire test is included in SSO. | 65.3 | 73.6 | 71.6 | 102 | 369 | 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. | 67.4 | 75.7 | 74.4 | 115 | 377 | | 69.7 | 78.5 | 74.8 | 109 | 367 |
| 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. | 654 | 712 | 705 | 1044 | 3883 | std::format std::string and hex number by literal to std::stringvoid ConcatAllFmtToHex(benchmark::State& state) {
+} | 692 | 695 | 713 | 1073 | 3765 | 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. | 874 | 969 | 1462 | 1832 | 4986 | Concat std::string and std::to_chars and string to std::stringvoid ConcatStdToCharsHex(benchmark::State& state) {
+} | 922 | 995 | 1544 | 1843 | 4994 | 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. | 196 | 252 | 189 | 253 | 1124 | Concat std::string and hex number and literal by StrExpr to std::stringvoid ConcatSimToStdHex(benchmark::State& state) {
+} | 198 | 250 | 192 | 255 | 1114 | 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. | 131 | 124 | 87.4 | 115 | 873 | Concat stringa and hex number and literal by StrExpr to simstr::stringavoid ConcatSimToSimHex(benchmark::State& state) {
+} | 132 | 125 | 91.6 | 114 | 885 | 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. | 115 | 120 | 77.7 | 99.3 | 257 | Concat stringa and hex number and literal by e_concat to simstr::stringavoid ConcatSimToSimHexC(benchmark::State& state) {
+} | 116 | 122 | 72.9 | 102 | 252 | 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. | 122 | 126 | 76.3 | 106 | 269 | Subst stringa and hex number by e_subst literal to simstr::stringavoid ConcatSimToSimHexS(benchmark::State& state) {
+} | 124 | 128 | 77.5 | 104 | 276 | 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. | 180 | 164 | 152 | 171 | 541 | Subst stringa and hex number by e_vsubst stra to simstr::stringavoid ConcatSimToSimHexVS(benchmark::State& state) {
+} | 181 | 174 | 154 | 176 | 548 | 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. | 313 | 302 | 279 | 356 | 1765 | | 312 | 304 | 287 | 365 | 1724 |
| 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);
}
}
-} | 280 | 266 | 660 | 698 | 843 | e_subst("abcdefghihklmopqr {} end", i / 0x8a010_fmt)void SubstSimToSimOct(benchmark::State& state) {
+} | 276 | 264 | 671 | 682 | 930 | 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);
}
}
-} | 341 | 324 | 778 | 813 | 1112 | e_vsubst(pattern, i / 0x8a010_fmt)void VSubstSimToSimOct(benchmark::State& state) {
+} | 352 | 318 | 750 | 798 | 1123 | 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. | 599 | 583 | 1061 | 1118 | 2885 | fmt::format(FMT_COMPILE("abcdefghihklmopqr {:#010o} end"), i)void FmtFormatComp(benchmark::State& state) {
+} | 616 | 583 | 1081 | 1128 | 2923 | 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);
}
}
-} | 676 | 785 | 1404 | 1550 | 4562 | fmt::format("abcdefghihklmopqr {:#010o} end", i)void FmtFormat(benchmark::State& state) {
+} | 755 | 809 | 1449 | 1577 | 4411 | 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. | 832 | 827 | 1355 | 1431 | 4550 | std::format("abcdefghihklmopqr {:#010o} end", i)void FormatStdToStdOct(benchmark::State& state) {
+} | 894 | 882 | 1364 | 1535 | 4578 | 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);
}
}
-} | 1007 | 1224 | 1542 | 1923 | 5661 | std::vformat(pattern, std::make_format_args(i))void VFormatStdToStdOct(benchmark::State& state) {
+} | 992 | 1261 | 1699 | 1931 | 5729 | 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. | 1001 | 1100 | 1549 | 1941 | 5730 | strm << "abcdefghihklmopqr 0" << std::oct << std::setw(9) << std::setfill('0') << i << " end"void StreamStdToStdOct(benchmark::State& state) {
+} | 1000 | 1151 | 1586 | 1914 | 5777 | 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. | 2029 | 2121 | 6785 | 7038 | 19623 | | 2055 | 2133 | 6885 | 7062 | 18843 |
| 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. | 49.0 | 52.3 | 41.5 | 55.6 | 143 | Concat std::string by StrExpr to std::stringvoid ConcatSimToStdS(benchmark::State& state) {
+} | 44.3 | 49.8 | 40.8 | 55.6 | 155 | 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. | 39.9 | 34.1 | 38.6 | 81.8 | 168 | Concat stringa by StrExpr to stringavoid ConcatSimToSimS(benchmark::State& state) {
+} | 31.3 | 32.3 | 38.2 | 79.3 | 175 | 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. | 27.1 | 27.5 | 28.7 | 50.8 | 136 | | 28.4 | 26.4 | 28.7 | 50.7 | 146 |
| 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");
-} | 110 | 137 | 205 | 228 | 542 | Find concat three strexprsize_t find_pos_exp(ssa src, ssa name) {
+} | 114 | 146 | 208 | 219 | 501 | Find concat three strexprsize_t find_pos_exp(ssa src, ssa name) {
return src.find(std::string{"\n- " + name + " -\n"});
-} | 51.5 | 38.1 | 118 | 132 | 294 | Find concat three simstrsize_t find_pos_sim(ssa src, ssa name) {
+} | 49.3 | 39.0 | 114 | 125 | 288 | 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 | 15.9 | 27.2 | 29.2 | 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.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) {
return src.find(sz::string{"\n- "}.append(name).append(" -\n"));
-} | 146 | 150 | 215 | 228 | 619 | | 143 | 139 | 214 | 228 | 621 |
| 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.65 | 10.1 | 8.48 | 18.1 | 27.4 | BuildTypeNameExp 0/0std::string buildTypeNameExp(ssa type_name, size_t prec, size_t scale) {
+} | 7.09 | 10.8 | 8.40 | 17.4 | 27.5 | 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.50 | 8.75 | 7.64 | 14.5 | 28.9 | BuildTypeNameSim 0/0stringa buildTypeNameSim(ssa type_name, size_t prec, size_t scale) {
+} | 6.90 | 8.49 | 7.43 | 12.8 | 29.2 | 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.14 | 4.90 | 7.75 | 16.3 | 38.4 | BuildTypeNameStr 10/10std::string buildTypeNameStr(std::string_view type_name, size_t prec, size_t scale) {
+} | 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) {
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.9 | 84.3 | 59.6 | 85.7 | 652 | BuildTypeNameExp 10/10std::string buildTypeNameExp(ssa type_name, size_t prec, size_t scale) {
+} | 56.3 | 87.2 | 58.8 | 77.5 | 661 | 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;
-} | 29.9 | 25.9 | 33.3 | 40.1 | 196 | BuildTypeNameSim 10/10stringa buildTypeNameSim(ssa type_name, size_t prec, size_t scale) {
+} | 31.0 | 26.8 | 32.1 | 39.5 | 201 | 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.9 | 23.6 | 25.6 | 40.1 | 141 | | 22.8 | 23.2 | 25.6 | 38.3 | 105 |
| 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.";
-} | 200 | 250 | 308 | 366 | 1074 | Concat with replace expstd::string make_str_exp(std::string_view from, std::string_view pattern, std::string_view repl) {
+} | 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) {
return "<" + e_repl(from, pattern, repl) + ">";
} | >> В simstr строковое выражение для замены подстрок
есть "из коробки".
-simstr has a string expression for replacing substrings out of the box. | 147 | 133 | 222 | 221 | 519 | | 147 | 142 | 217 | 225 | 502 |
| 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.09 | 1.14 | 3.25 | 2.60 | std::string_view e;template<typename T>
+Empty lines, nothing unusual. | 1.11 | 1.14 | 1.10 | 2.59 | 2.63 | std::string_view e;template<typename T>
void CreateEmpty(benchmark::State& state) {
for (auto _: state) {
T empty_string;
benchmark::DoNotOptimize(empty_string);
}
-} | 0.375 | 0.739 | 0.372 | 1.85 | 2.15 | ssa e;template<typename T>
+} | 0.369 | 0.770 | 0.366 | 1.84 | 2.19 | ssa e;template<typename T>
void CreateEmpty(benchmark::State& state) {
for (auto _: state) {
T empty_string;
benchmark::DoNotOptimize(empty_string);
}
-} | 0.361 | 0.183 | 0.359 | 1.45 | 2.16 | stringa e;template<typename T>
+} | 0.371 | 0.188 | 0.364 | 1.84 | 2.14 | stringa e;template<typename T>
void CreateEmpty(benchmark::State& state) {
for (auto _: state) {
T empty_string;
benchmark::DoNotOptimize(empty_string);
}
-} | 0.753 | 0.731 | 0.736 | 2.20 | 5.52 | lstringa<20> e;template<typename T>
+} | 0.758 | 0.777 | 0.745 | 2.20 | 2.97 | lstringa<20> e;template<typename T>
void CreateEmpty(benchmark::State& state) {
for (auto _: state) {
T empty_string;
benchmark::DoNotOptimize(empty_string);
}
-} | 1.20 | 1.11 | 1.11 | 2.59 | 9.16 | lstringa<40> e;template<typename T>
+} | 1.14 | 1.14 | 1.12 | 2.58 | 3.67 | lstringa<40> e;template<typename T>
void CreateEmpty(benchmark::State& state) {
for (auto _: state) {
T empty_string;
benchmark::DoNotOptimize(empty_string);
}
-} | 1.13 | 1.11 | 1.10 | 2.62 | 8.53 | | 1.15 | 1.18 | 1.16 | 2.54 | 3.54 |
| 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.81 | 1.84 | 1.81 | 2.67 | 10.4 | std::string_view e = "Test text";template<typename T>
+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>
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.731 | 0.736 | 0.734 | 1.84 | 2.18 | ssa e = "Test text";template<typename T>
+a pointer to text and its length. | 0.760 | 0.765 | 0.736 | 1.84 | 2.19 | 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.367 | 0.750 | 0.364 | 1.87 | 2.17 | stringa e = "Test text";template<typename T>
+} | 0.380 | 0.765 | 0.363 | 1.82 | 2.14 | 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.11 | 1.11 | 1.11 | 2.86 | 8.30 | lstringa<20> e = "Test text";template<typename T>
+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>
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.85 | 1.84 | 1.87 | 2.55 | 3.89 | lstringa<40> e = "Test text";template<typename T>
+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>
void CreateShortLiteral(benchmark::State& state) {
for (auto _: state) {
T empty_string = TEST_TEXT;
benchmark::DoNotOptimize(empty_string);
}
-} | 1.88 | 1.84 | 1.94 | 2.53 | 3.93 | | 1.83 | 1.92 | 1.84 | 2.62 | 3.99 |
| 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... | 19.1 | 19.2 | 73.4 | 73.6 | 68.6 | std::string_view e = "123456789012345678901234567890";template<typename T>
+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>
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.762 | 0.752 | 0.750 | 1.83 | 2.19 | ssa e = "123456789012345678901234567890";template<typename T>
+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>
void CreateLongLiteral(benchmark::State& state) {
for (auto _: state) {
T empty_string{LONG_TEXT};
benchmark::DoNotOptimize(empty_string);
}
-} | 0.369 | 0.733 | 0.360 | 1.81 | 2.18 | stringa e = "123456789012345678901234567890";template<typename T>
+} | 0.383 | 0.767 | 0.364 | 1.84 | 2.14 | 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.09 | 1.11 | 1.08 | 2.54 | 8.30 | lstringa<20> e = "123456789012345678901234567890";template<typename T>
+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>
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 | 20.4 | 73.6 | 75.1 | 68.6 | lstringa<40> e = "123456789012345678901234567890";template<typename T>
+Obviously, 30 characters already require allocation. | 21.0 | 24.0 | 73.7 | 74.5 | 69.7 | 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.54 | 1.82 | 2.50 | 3.27 | 11.4 | | 2.59 | 1.94 | 2.54 | 3.34 | 16.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 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.58 | 5.62 | 1.82 | 5.10 | 7.32 | 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.27 | 5.67 | 1.83 | 5.36 | 6.73 | 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.370 | 0.365 | 0.363 | 3.79 | 2.17 | ssa e = "Test text"; auto c{e};template<typename T>
+} | 0.383 | 0.378 | 0.366 | 2.92 | 2.20 | 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.372 | 0.374 | 0.366 | 3.85 | 2.18 | stringa e = "Test text"; auto c{e};template<typename T>
+string information is copied. | 0.376 | 0.391 | 0.364 | 2.92 | 2.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.11 | 1.28 | 4.00 | 6.33 | lstringa<20> e = "Test text"; auto c{e};template<typename T>
+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>
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.49 | 1.11 | 1.50 | 4.38 | 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.47 | 4.71 | 7.15 | 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.48 | 1.13 | 1.47 | 4.52 | 7.33 | | 1.52 | 1.15 | 1.48 | 5.44 | 7.34 |
| 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.0 | 23.8 | 75.8 | 78.3 | 120 | std::string_view e = "123456789012345678901234567890"; auto c{e};template<typename T>
+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>
void CopyLongString(benchmark::State& state) {
T x = LONG_TEXT;
for (auto _: state) {
T copy{x};
benchmark::DoNotOptimize(copy);
}
-} | 0.761 | 0.735 | 0.735 | 1.85 | 2.22 | ssa e = "123456789012345678901234567890"; auto c{e};template<typename T>
+} | 0.752 | 0.775 | 0.734 | 1.49 | 2.22 | 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.366 | 0.742 | 0.361 | 1.81 | 2.16 | stringa e = "123456789012345678901234567890"; auto c{e};template<typename T>
+} | 0.375 | 0.747 | 0.364 | 1.52 | 2.16 | 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.30 | 1.82 | 2.93 | 8.35 | lstringa<20> e = "123456789012345678901234567890"; auto c{e};template<typename T>
+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>
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.0 | 19.8 | 75.1 | 82.0 | 67.2 | lstringa<40> e = "123456789012345678901234567890"; auto c{e};template<typename T>
+Doesn't fit, allocation. | 21.5 | 20.4 | 75.7 | 79.5 | 72.7 | 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.83 | 4.67 | 4.73 | 7.56 | 19.7 | | 4.61 | 4.84 | 4.84 | 7.37 | 50.4 |
| 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. | 93.4 | 93.8 | 98.8 | 115 | 227 | std::string::find;template<typename T>
+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>
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.54 | 7.67 | 39.3 | 39.0 | 99.1 | std::string_view::find;template<typename T>
+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>
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);
}
-} | 6.70 | 7.48 | 52.1 | 40.1 | 97.5 | ssa::find;template<typename T>
+} | 7.54 | 8.19 | 52.2 | 39.0 | 96.4 | 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.49 | 6.78 | 19.5 | 21.4 | 96.3 | stringa::find;template<typename T>
+} | 7.60 | 6.99 | 18.9 | 21.9 | 97.9 | 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);
}
-} | 7.84 | 7.17 | 18.9 | 30.1 | 97.2 | lstringa<20>::find;template<typename T>
+} | 8.42 | 6.91 | 19.4 | 31.0 | 99.1 | 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);
}
-} | 7.38 | 6.96 | 17.6 | 22.0 | 97.6 | lstringa<40>::find;template<typename T>
+} | 6.84 | 6.65 | 17.6 | 21.9 | 115 | 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);
}
-} | 7.02 | 6.64 | 18.2 | 20.7 | 96.0 | | 6.91 | 6.58 | 18.0 | 22.2 | 115 |
| 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);
}
-} | 4.87 | 7.91 | 1.83 | 4.42 | 125 | std::string copy{str_with_len_N};/16template<typename T>
+} | 5.95 | 9.01 | 1.85 | 5.24 | 125 | 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.2 | 26.5 | 80.8 | 81.3 | 123 | std::string copy{str_with_len_N};/23template<typename T>
+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>
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.5 | 27.3 | 78.3 | 78.6 | 128 | std::string copy{str_with_len_N};/24template<typename T>
+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>
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);
}
-} | 22.6 | 27.7 | 78.5 | 79.8 | 120 | std::string copy{str_with_len_N};/32template<typename T>
+} | 23.5 | 28.8 | 77.5 | 77.5 | 120 | 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);
}
-} | 22.6 | 26.5 | 81.8 | 83.8 | 128 | std::string copy{str_with_len_N};/64template<typename T>
+} | 24.0 | 27.3 | 83.0 | 86.2 | 124 | 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);
}
-} | 22.3 | 26.9 | 82.8 | 81.7 | 131 | std::string copy{str_with_len_N};/128template<typename T>
+} | 23.1 | 27.0 | 81.2 | 80.0 | 123 | 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);
}
-} | 23.7 | 28.9 | 82.6 | 87.7 | 132 | std::string copy{str_with_len_N};/256template<typename T>
+} | 25.3 | 29.2 | 83.8 | 84.8 | 133 | 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);
}
-} | 24.9 | 28.8 | 85.0 | 88.5 | 161 | std::string copy{str_with_len_N};/512template<typename T>
+} | 31.4 | 34.2 | 88.0 | 88.0 | 156 | 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.5 | 33.6 | 86.5 | 92.7 | 149 | std::string copy{str_with_len_N};/1024template<typename T>
+} | 28.8 | 34.0 | 92.5 | 88.8 | 150 | 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.8 | 44.2 | 95.3 | 97.1 | 156 | std::string copy{str_with_len_N};/2048template<typename T>
+} | 34.9 | 37.7 | 102 | 97.7 | 174 | 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);
}
-} | 79.1 | 80.3 | 133 | 129 | 206 | std::string copy{str_with_len_N};/4096template<typename T>
+} | 81.2 | 81.1 | 123 | 135 | 217 | 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. | 111 | 115 | 179 | 180 | 271 | stringa copy{str_with_len_N};/15template<typename T>
+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>
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.09 | 1.29 | 4.00 | 4.60 | stringa copy{str_with_len_N};/16template<typename T>
+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>
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.13 | 1.10 | 1.32 | 4.02 | 7.36 | stringa copy{str_with_len_N};/23template<typename T>
+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>
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.11 | 1.10 | 1.29 | 4.10 | 7.39 | stringa copy{str_with_len_N};/24template<typename T>
+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>
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. | 15.9 | 16.1 | 15.8 | 18.4 | 7.35 | stringa copy{str_with_len_N};/32template<typename T>
+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>
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.0 | 15.8 | 18.4 | 7.33 | stringa copy{str_with_len_N};/64template<typename T>
+} | 16.0 | 16.4 | 17.4 | 18.5 | 7.82 | 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.0 | 16.1 | 15.8 | 18.3 | 7.37 | stringa copy{str_with_len_N};/128template<typename T>
+} | 16.3 | 16.4 | 16.0 | 18.6 | 7.90 | 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.0 | 16.0 | 15.7 | 18.4 | 7.30 | stringa copy{str_with_len_N};/256template<typename T>
+} | 16.1 | 16.5 | 16.0 | 18.5 | 7.78 | 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.0 | 15.9 | 15.8 | 18.3 | 7.33 | stringa copy{str_with_len_N};/512template<typename T>
+} | 16.1 | 16.4 | 16.0 | 18.7 | 8.03 | 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.0 | 15.7 | 18.2 | 7.44 | stringa copy{str_with_len_N};/1024template<typename T>
+} | 16.0 | 16.4 | 16.0 | 18.6 | 7.91 | 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.0 | 16.1 | 15.8 | 18.2 | 7.35 | stringa copy{str_with_len_N};/2048template<typename T>
+} | 16.2 | 16.6 | 16.0 | 18.6 | 7.78 | 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);
}
-} | 15.9 | 16.2 | 16.8 | 18.3 | 7.33 | stringa copy{str_with_len_N};/4096template<typename T>
+} | 16.2 | 16.7 | 16.0 | 18.5 | 7.80 | 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. | 15.9 | 16.0 | 15.7 | 18.3 | 7.36 | lstringa<16> copy{str_with_len_N};/15template<typename T>
+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>
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.47 | 1.10 | 1.50 | 4.84 | 7.29 | lstringa<16> copy{str_with_len_N};/16template<typename T>
+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>
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);
}
-} | 5.22 | 5.38 | 5.09 | 8.98 | 19.3 | lstringa<16> copy{str_with_len_N};/23template<typename T>
+} | 4.83 | 4.98 | 5.17 | 8.48 | 20.7 | 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);
}
-} | 5.16 | 5.43 | 5.36 | 9.08 | 85.0 | lstringa<16> copy{str_with_len_N};/24template<typename T>
+} | 4.81 | 5.05 | 5.12 | 8.50 | 88.9 | 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. | 22.6 | 23.6 | 76.8 | 81.2 | 85.7 | lstringa<16> copy{str_with_len_N};/32template<typename T>
+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>
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);
}
-} | 23.0 | 23.5 | 81.4 | 85.0 | 93.3 | lstringa<16> copy{str_with_len_N};/64template<typename T>
+} | 25.1 | 24.4 | 83.5 | 83.2 | 92.9 | 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);
}
-} | 25.5 | 25.7 | 80.8 | 83.7 | 92.8 | lstringa<16> copy{str_with_len_N};/128template<typename T>
+} | 27.4 | 26.2 | 84.6 | 84.0 | 96.1 | 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);
}
-} | 25.7 | 25.6 | 82.8 | 90.0 | 95.0 | lstringa<16> copy{str_with_len_N};/256template<typename T>
+} | 27.1 | 27.6 | 84.6 | 87.1 | 97.2 | 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);
}
-} | 27.1 | 28.0 | 87.4 | 93.2 | 126 | lstringa<16> copy{str_with_len_N};/512template<typename T>
+} | 28.1 | 27.8 | 85.7 | 90.7 | 130 | 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);
}
-} | 29.8 | 29.6 | 86.9 | 91.0 | 119 | lstringa<16> copy{str_with_len_N};/1024template<typename T>
+} | 30.7 | 31.0 | 87.1 | 89.3 | 116 | 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);
}
-} | 51.8 | 56.5 | 93.4 | 98.2 | 120 | lstringa<16> copy{str_with_len_N};/2048template<typename T>
+} | 52.9 | 55.0 | 96.6 | 101 | 139 | 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);
}
-} | 65.7 | 66.4 | 133 | 130 | 169 | lstringa<16> copy{str_with_len_N};/4096template<typename T>
+} | 67.6 | 64.4 | 125 | 125 | 178 | 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);
}
-} | 86.4 | 87.0 | 189 | 183 | 236 | lstringa<512> copy{str_with_len_N};/15template<typename T>
+} | 87.8 | 90.0 | 180 | 190 | 221 | 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.49 | 1.14 | 1.49 | 4.03 | 7.25 | lstringa<512> copy{str_with_len_N};/16template<typename T>
+} | 1.58 | 1.13 | 1.45 | 4.82 | 8.09 | 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);
}
-} | 5.15 | 4.46 | 5.15 | 8.78 | 19.5 | lstringa<512> copy{str_with_len_N};/23template<typename T>
+} | 4.90 | 4.48 | 5.21 | 9.21 | 21.2 | 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);
}
-} | 5.25 | 4.67 | 5.14 | 8.82 | 19.9 | lstringa<512> copy{str_with_len_N};/24template<typename T>
+} | 4.83 | 4.49 | 5.18 | 9.42 | 20.4 | 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);
}
-} | 5.09 | 4.10 | 5.12 | 8.74 | 19.4 | lstringa<512> copy{str_with_len_N};/32template<typename T>
+} | 4.78 | 4.10 | 5.21 | 9.49 | 20.3 | 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);
}
-} | 5.26 | 4.20 | 8.25 | 11.9 | 22.7 | lstringa<512> copy{str_with_len_N};/64template<typename T>
+} | 4.59 | 4.40 | 8.19 | 12.2 | 22.6 | 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.39 | 5.66 | 8.00 | 12.3 | 22.4 | lstringa<512> copy{str_with_len_N};/128template<typename T>
+} | 6.15 | 5.64 | 8.21 | 12.2 | 23.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);
}
-} | 6.59 | 6.97 | 8.46 | 12.4 | 23.6 | lstringa<512> copy{str_with_len_N};/256template<typename T>
+} | 7.02 | 7.25 | 8.48 | 12.7 | 24.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);
}
-} | 7.99 | 7.99 | 9.58 | 13.4 | 24.8 | lstringa<512> copy{str_with_len_N};/512template<typename T>
+} | 8.43 | 7.90 | 9.79 | 13.6 | 26.6 | 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. | 10.5 | 10.3 | 11.0 | 14.7 | 28.3 | lstringa<512> copy{str_with_len_N};/1024template<typename T>
+allocation or atomic increment. | 11.5 | 10.4 | 11.2 | 15.4 | 28.5 | 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. | 52.1 | 54.2 | 94.5 | 93.5 | 121 | lstringa<512> copy{str_with_len_N};/2048template<typename T>
+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>
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);
}
-} | 64.9 | 66.7 | 134 | 127 | 167 | lstringa<512> copy{str_with_len_N};/4096template<typename T>
+} | 65.8 | 66.5 | 124 | 127 | 174 | 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);
}
-} | 87.6 | 85.2 | 193 | 192 | 237 | | 92.2 | 89.3 | 182 | 191 | 220 |
| 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. | 26.9 | 27.2 | 30.6 | 31.5 | 203 | 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.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) {
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. | 14.5 | 12.0 | 13.5 | 14.8 | 2.18 | stringa s = "123456789"; int res = s.to_int<int, true, 10, false>template<typename T>
+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>
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.62 | 8.54 | 13.8 | 15.9 | 50.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.58 | 8.79 | 13.4 | 16.5 | 61.4 | ssa s = "123456789"; int res = s.to_int<int, true, 10, false>template<typename T>
void ToIntSimStr10(benchmark::State& state, T t, int c) {
for (auto _: state) {
int res = t. template to_int<int, true, 10, false, false>().value;
@@ -1766,8 +1766,8 @@ void ToIntSimStr10(benchmark::State& state, T t, int c) {
benchmark::DoNotOptimize(res);
benchmark::DoNotOptimize(t);
}
-} | 9.84 | 7.79 | 9.17 | 15.2 | 47.5 | lstringa<20> s = "123456789"; int res = s.to_int<int, true, 10, false>template<typename 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>
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.22 | 8.67 | 13.9 | 15.3 | 46.7 | | 9.49 | 8.74 | 13.3 | 15.2 | 49.4 |
| 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 | 22.8 | 23.8 | 34.2 | 34.5 | 151 | std::string_view s = "abcDef"; std::from_chars(s.data(), s.data() + s.size(), res, 16);void ToIntFromChars16(benchmark::State& state, const std::string_view& s, int c) {
+Everything is the same, only for the hexadecimal system | 24.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) {
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.22 | 8.07 | 8.11 | 9.16 | 53.9 | stringa s = "abcDef"; int res = s.to_int<int, true, 16, false>template<typename T>
+} | 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>
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.55 | 8.44 | 12.7 | 13.8 | 46.1 | ssa s = "abcDef"; int res = s.to_int<int, true, 16, false>template<typename 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>
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.55 | 6.72 | 7.39 | 13.4 | 44.8 | lstringa<20> s = "abcDef"; int res = s.to_int<int, true, 16, false>template<typename 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>
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.45 | 8.42 | 12.7 | 13.6 | 44.0 | | 7.71 | 8.72 | 11.8 | 12.6 | 46.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 | ||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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. | 28.8 | 27.8 | 42.8 | 44.1 | 219 | stringa s = " 123456789"; int res = s.to_int<int>; // Check overflowtemplate<typename T>
+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>
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.4 | 15.3 | 18.5 | 22.3 | 35.2 | ssa s = " 123456789"; int res = s.to_int<int, false>; // No check overflowvoid ToIntNoOverflow(benchmark::State& state, ssa t, int c) {
+} | 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) {
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);
}
-} | 12.9 | 10.8 | 13.6 | 18.8 | 44.3 | | 13.1 | 10.9 | 12.9 | 18.9 | 45.9 |
| 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);
}
-} | 66.2 | 62.8 | 97.9 | 103 | 633 | 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) {
+} | 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) {
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);
}
-} | 23.6 | 24.2 | 58.4 | 77.6 | 279 | ssa s = "1234.567e10"; double res = *s.to_double()template<typename T>
+} | 24.2 | 25.0 | 59.5 | 84.1 | 273 | 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);
}
-} | 24.8 | 24.5 | 35.1 | 36.4 | 91.4 | | 26.4 | 24.4 | 35.5 | 37.8 | 93.8 |
| 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);
}
-} | 1336 | 1345 | 4844 | 5669 | 15882 | std::string str; ... str += "abbaabbaabbaabba";void AppendStdStringConstLiteral(benchmark::State& state) {
+} | 1396 | 1375 | 4726 | 5627 | 15958 | 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);
}
-} | 407 | 346 | 1045 | 1305 | 1402 | lstringa<8> str; ... str += "abbaabbaabbaabba";template<unsigned N>
+} | 375 | 350 | 1064 | 1313 | 1434 | 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);
}
-} | 376 | 345 | 782 | 986 | 1320 | lstringa<128> str; ... str += "abbaabbaabbaabba";template<unsigned N>
+} | 369 | 338 | 793 | 942 | 1411 | 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. | 236 | 239 | 406 | 582 | 889 | lstringa<512> str; ... str += "abbaabbaabbaabba";template<unsigned N>
+required, and the faster the result. | 233 | 245 | 393 | 519 | 920 | 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);
}
-} | 206 | 209 | 268 | 400 | 624 | lstringa<1024> str; ... str += "abbaabbaabbaabba";template<unsigned N>
+} | 238 | 217 | 259 | 370 | 638 | 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);
}
-} | 136 | 139 | 156 | 244 | 497 | | 163 | 141 | 134 | 288 | 509 |
| 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);
}
-} | 1362 | 1345 | 4654 | 5946 | 16035 | std::string str; ... str += str_var + "abbaabbaabbaabba";void AppendStdStrStrConstLiteral(benchmark::State& state) {
+} | 1370 | 1370 | 4556 | 6205 | 16329 | 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);
}
-} | 1221 | 1298 | 3736 | 4420 | 4646 | lstringa<8> str; ... str += str_var + "abbaabbaabbaabba";template<unsigned N>
+} | 1302 | 1238 | 3712 | 3832 | 4574 | 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);
}
-} | 385 | 403 | 713 | 920 | 1514 | lstringa<128> str; ... str += str_var + "abbaabbaabbaabba";template<unsigned N>
+} | 415 | 405 | 716 | 841 | 1521 | 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);
}
-} | 301 | 342 | 437 | 635 | 1209 | lstringa<512> str; ... str += str_var + "abbaabbaabbaabba";template<unsigned N>
+} | 339 | 339 | 444 | 525 | 1206 | 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);
}
-} | 293 | 299 | 281 | 384 | 986 | lstringa<1024> str; ... str += str_var + "abbaabbaabbaabba";template<unsigned N>
+} | 265 | 315 | 286 | 391 | 916 | 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);
}
-} | 235 | 254 | 187 | 273 | 827 | | 205 | 250 | 183 | 286 | 813 |
| 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);
}
-} | 111021 | 113874 | 234977 | 272220 | 821457 | std::string str; ... str += str_var + "abbaabbaabbaabba"; 2048 timesvoid AppendStdStrStrConstLiteralBig(benchmark::State& state) {
+} | 123086 | 125525 | 217525 | 285336 | 833815 | 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);
}
-} | 69967 | 73347 | 192544 | 203527 | 238655 | lstringa<8> str; ... str += str_var + "abbaabbaabbaabba"; 2048 timestemplate<unsigned N>
+} | 73997 | 73243 | 191801 | 192976 | 241478 | 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);
}
-} | 45414 | 44770 | 20077 | 24303 | 58092 | lstringa<128> str; ... str += str_var + "abbaabbaabbaabba"; 2048 timestemplate<unsigned N>
+} | 46351 | 49189 | 19975 | 25665 | 57002 | 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);
}
-} | 23033 | 25460 | 16403 | 22770 | 56704 | lstringa<512> str; ... str += str_var + "abbaabbaabbaabba"; 2048 timestemplate<unsigned N>
+} | 27970 | 26787 | 16815 | 22282 | 56617 | 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);
}
-} | 19267 | 18428 | 16237 | 22095 | 55779 | lstringa<1024> str; ... str += str_var + "abbaabbaabbaabba"; 2048 timestemplate<unsigned N>
+} | 19316 | 20894 | 16248 | 21972 | 53906 | 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);
}
-} | 17475 | 17351 | 15954 | 21427 | 56710 | | 15641 | 16956 | 16122 | 22145 | 55763 |
| 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);
}
-} | 1361 | 1352 | 4325 | 5265 | 16125 | std::string str; ... str += str_var1 + str_var2;void AppendStdStr2String(benchmark::State& state) {
+} | 1388 | 1440 | 4414 | 5300 | 15927 | 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);
}
-} | 1397 | 1422 | 4072 | 4034 | 5089 | lstringa<16> str; ... str += str_var1 + str_var2;template<unsigned N>
+} | 1441 | 1374 | 3894 | 3964 | 4954 | 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);
}
-} | 452 | 465 | 794 | 911 | 1846 | lstringa<128> str; ... str += str_var1 + str_var2;template<unsigned N>
+} | 500 | 476 | 791 | 909 | 1852 | 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);
}
-} | 407 | 415 | 512 | 620 | 1663 | lstringa<512> str; ... str += str_var1 + str_var2;template<unsigned N>
+} | 401 | 416 | 523 | 624 | 1497 | 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);
}
-} | 351 | 361 | 395 | 469 | 1291 | lstringa<1024> str; ... str += str_var1 + str_var2;template<unsigned N>
+} | 370 | 368 | 394 | 476 | 1196 | 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);
}
-} | 300 | 322 | 287 | 362 | 1066 | | 302 | 316 | 288 | 367 | 1089 |
| 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);
}
}
-} | 3011 | 3192 | 10825 | 11467 | 25591 | std::string str = "test = " + std::to_string(k) + " times";void AppendStdStringStrNumStr(benchmark::State& state) {
+} | 3023 | 3250 | 11096 | 11879 | 25783 | 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);
}
}
-} | 434 | 505 | 1066 | 1162 | 3456 | char buf[100]; sprintf(buf, "test = %u times", k); std::string str = buf;void AppendSprintfStrNumStr(benchmark::State& state) {
+} | 443 | 428 | 1066 | 1691 | 3681 | 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);
}
}
-} | 1391 | 1544 | 2723 | 2743 | 10939 | std::string str = std::format("test = {} times", k);void AppendFormatStrNumStr(benchmark::State& state) {
+} | 1337 | 1489 | 2788 | 2823 | 10716 | 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);
}
}
-} | 1154 | 1453 | 1842 | 2397 | 5707 | lstringa<8> str; str.format("test = {} times", k);template<typename T>
+} | 1174 | 1458 | 1845 | 2332 | 5711 | 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. | 1374 | 1547 | 2012 | 2712 | 8601 | lstringa<32> str; str.format("test = {} times", k);template<typename T>
+string without allocation. | 1348 | 1574 | 2035 | 2730 | 8447 | 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. | 997 | 1083 | 1004 | 1521 | 7339 | lstringa<8> str = "test = " + k + " times";template<typename T>
+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>
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. | 272 | 295 | 821 | 899 | 1332 | lstringa<32> str = "test = " + k + " times";template<typename T>
+The result does not fit into SSO, an allocation occurs. | 286 | 303 | 821 | 938 | 1418 | 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. | 124 | 149 | 136 | 177 | 570 | stringa str = "test = " + k + " times";template<typename T>
+Once again, use appropriately sized buffers from the start. | 129 | 148 | 142 | 171 | 572 | 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. | 117 | 130 | 121 | 178 | 1253 | | 133 | 137 | 122 | 174 | 1197 |
| 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. | 266 | 275 | 546 | 551 | 1483 | ssa::splitter + ssa::as_intvoid SplitConvertIntSimStr(benchmark::State& state) {
+} | 259 | 279 | 544 | 545 | 1443 | 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. | 156 | 151 | 165 | 300 | 587 | ssa::splitf + functorvoid SplitConvertIntSplitf(benchmark::State& state) {
+} | 157 | 134 | 165 | 298 | 595 | 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. | 208 | 122 | 191 | 215 | 840 | | 210 | 139 | 190 | 214 | 853 |
| 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. | 835 | 834 | 1108 | 1224 | 4781 | replace symbols with std::string find_first_of + replacevoid ReplaceSymbolsStdStringNaiveRight(benchmark::State& state) {
+it works quickly. | 881 | 1153 | 1093 | 1191 | 4959 | 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. | 835 | >> Дальше уже правильные реализации, не зависящие от конфликтующих замен.
Further, there are correct implementations that do not depend on
-conflicting replacements. | 2459 | 2603 | 2009 | 2264 | 8914 | replace symbols with std::string_view find_first_of + copyvoid ReplaceSymbolsStdString(benchmark::State& state) {
+conflicting replacements. | 2480 | 2567 | 2049 | 2209 | 9947 | 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. | 2459 | 1128 | 1037 | 2277 | 2662 | 4601 | replace runtime symbols with string expressions and without remembering all search resultstemplate<bool UseVector>
+} | 1093 | 959 | 2329 | 2598 | 4617 | 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);
}
-} | 1268 | 1542 | 1448 | 1582 | 4270 | replace runtime symbols with simstr and memorization of all search resultstemplate<bool UseVector>
+} | 1265 | 1461 | 1454 | 1546 | 4256 | 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);
}
-} | 1010 | 1156 | 1363 | 1398 | 3830 | replace const symbols with string expressions and without remembering all search resultstemplate<bool UseVector>
+} | 1114 | 1209 | 1257 | 1349 | 3810 | 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);
}
-} | 1061 | 1193 | 1229 | 1251 | 3372 | replace const symbols with string expressions and memorization of all search resultstemplate<bool UseVector>
+} | 1098 | 1207 | 1136 | 1272 | 3231 | 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);
}
-} | 840 | 837 | 1096 | 1243 | 2905 | | 837 | 854 | 1188 | 1283 | 3050 |
| 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);
}
-} | 150 | 154 | 305 | 337 | 866 | Short replace symbols with std::string find_first_of + replacevoid ShortReplaceSymbolsStdStringNaiveRight(benchmark::State& state) {
+} | 162 | 162 | 307 | 332 | 889 | 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);
}
-} | 313 | 301 | 356 | 423 | 1328 | Short replace symbols with std::string_view find_first_of + copyvoid ShortReplaceSymbolsStdString(benchmark::State& state) {
+} | 321 | 333 | 361 | 419 | 1379 | 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);
}
-} | 153 | 154 | 307 | 350 | 797 | Short replace runtime symbols with string expressions and without remembering all search resultstemplate<bool UseVector>
+} | 159 | 168 | 315 | 344 | 804 | 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);
}
-} | 172 | 178 | 259 | 298 | 656 | Short replace runtime symbols with simstr and memorization of all search resultstemplate<bool UseVector>
+} | 181 | 185 | 242 | 299 | 645 | 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);
}
-} | 173 | 192 | 355 | 396 | 831 | Short replace const symbols with string expressions and without remembering all search resultstemplate<bool UseVector>
+} | 293 | 209 | 338 | 380 | 770 | 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);
}
-} | 138 | 149 | 199 | 253 | 438 | Short replace const symbols with string expressions and memorization of all search resultstemplate<bool UseVector>
+} | 130 | 147 | 195 | 243 | 438 | 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);
}
-} | 141 | 134 | 289 | 349 | 553 | | 139 | 134 | 309 | 344 | 577 |
| 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);
}
-} | 157 | 152 | 217 | 241 | 754 | replace bb to ---- in std::string|256template<size_t Long>
+} | 153 | 159 | 216 | 239 | 776 | 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);
}
-} | 527 | 463 | 736 | 791 | 2292 | replace bb to ---- in std::string|512template<size_t Long>
+} | 553 | 502 | 734 | 791 | 2406 | 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);
}
-} | 1332 | 1323 | 1385 | 1425 | 4359 | replace bb to ---- in std::string|1024template<size_t Long>
+} | 1093 | 995 | 1372 | 1460 | 4112 | 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);
}
-} | 2359 | 2217 | 3048 | 3130 | 8819 | replace bb to ---- in std::string|2048template<size_t Long>
+} | 2427 | 2262 | 2999 | 3181 | 9118 | 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);
}
-} | 5479 | 5811 | 7662 | 7950 | 18166 | replace bb to ---- in lstringa<8>|64template<size_t N, size_t Count>
+} | 5988 | 6071 | 7578 | 7842 | 19199 | 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);
}
-} | 137 | 137 | 218 | 234 | 590 | replace bb to ---- in lstringa<8>|256template<size_t N, size_t Count>
+} | 129 | 138 | 214 | 225 | 620 | 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);
}
-} | 426 | 451 | 613 | 662 | 1916 | replace bb to ---- in lstringa<8>|512template<size_t N, size_t Count>
+} | 433 | 475 | 605 | 653 | 1900 | 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);
}
-} | 781 | 857 | 1056 | 1118 | 3332 | replace bb to ---- in lstringa<8>|1024template<size_t N, size_t Count>
+} | 786 | 893 | 1028 | 1086 | 3505 | 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);
}
-} | 1574 | 1683 | 1894 | 1999 | 6057 | replace bb to ---- in lstringa<8>|2048template<size_t N, size_t Count>
+} | 1611 | 1660 | 1795 | 2002 | 6338 | 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);
}
-} | 3024 | 3386 | 3567 | 3914 | 11959 | replace bb to ---- by init stringa|64template<size_t Count>
+} | 3063 | 3247 | 3547 | 3792 | 12720 | 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.9 | 90.1 | 170 | 195 | 403 | replace bb to ---- by init stringa|256template<size_t Count>
+} | 91.6 | 84.8 | 168 | 195 | 379 | 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);
}
-} | 305 | 294 | 369 | 465 | 1149 | replace bb to ---- by init stringa|512template<size_t Count>
+} | 309 | 282 | 362 | 461 | 1126 | 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 | 673 | 806 | 1064 | 2695 | replace bb to ---- by init stringa|1024template<size_t Count>
+} | 700 | 674 | 824 | 1061 | 2808 | 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);
}
-} | 1564 | 1470 | 1658 | 2218 | 5688 | replace bb to ---- by init stringa|2048template<size_t Count>
+} | 1592 | 1535 | 1578 | 2174 | 5776 | 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);
}
-} | 3148 | 2966 | 3213 | 4628 | 11882 | | 3230 | 3000 | 3172 | 4494 | 12197 |
| 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);
}
-} | 131 | 113 | 186 | 200 | 556 | replace bb to -- in std::string|256template<size_t Long>
+} | 107 | 115 | 180 | 193 | 557 | 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);
}
-} | 367 | 360 | 464 | 527 | 1773 | replace bb to -- in std::string|512template<size_t Long>
+} | 376 | 408 | 468 | 514 | 1747 | 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);
}
-} | 722 | 729 | 843 | 925 | 3125 | replace bb to -- in std::string|1024template<size_t Long>
+} | 745 | 702 | 862 | 936 | 3241 | 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);
}
-} | 1429 | 1303 | 1576 | 1849 | 6361 | replace bb to -- in std::string|2048template<size_t Long>
+} | 1481 | 1454 | 1609 | 1727 | 6280 | 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);
}
-} | 2801 | 2642 | 3142 | 3432 | 11893 | replace bb to -- in lstringa<8>|64template<size_t N, size_t Long>
+} | 2855 | 2708 | 3098 | 3417 | 12918 | 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);
}
-} | 99.6 | 93.3 | 185 | 184 | 439 | replace bb to -- in lstringa<8>|256template<size_t N, size_t Long>
+} | 94.5 | 92.0 | 177 | 186 | 466 | 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);
}
-} | 289 | 284 | 423 | 441 | 1355 | replace bb to -- in lstringa<8>|512template<size_t N, size_t Long>
+} | 290 | 302 | 453 | 435 | 1429 | 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);
}
-} | 523 | 517 | 728 | 773 | 2540 | replace bb to -- in lstringa<8>|1024template<size_t N, size_t Long>
+} | 554 | 541 | 797 | 783 | 2538 | 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);
}
-} | 1058 | 1029 | 1403 | 1438 | 4650 | replace bb to -- in lstringa<8>|2048template<size_t N, size_t Long>
+} | 1047 | 1033 | 1460 | 1432 | 4898 | 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);
}
-} | 2093 | 2035 | 2686 | 2797 | 9148 | replace bb to -- by init stringa|64template<size_t Count>
+} | 2056 | 2000 | 2850 | 2808 | 9438 | 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);
}
-} | 74.4 | 83.5 | 151 | 165 | 309 | replace bb to -- by init stringa|256template<size_t Count>
+} | 76.9 | 82.3 | 149 | 163 | 318 | 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 | 263 | 320 | 371 | 967 | replace bb to -- by init stringa|512template<size_t Count>
+} | 238 | 264 | 327 | 368 | 958 | 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);
}
-} | 420 | 516 | 523 | 613 | 1774 | replace bb to -- by init stringa|1024template<size_t Count>
+} | 428 | 571 | 518 | 634 | 1814 | 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);
}
-} | 869 | 999 | 978 | 1103 | 3375 | replace bb to -- by init stringa|2048template<size_t Count>
+} | 858 | 1012 | 979 | 1114 | 3500 | 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);
}
-} | 1707 | 1966 | 1763 | 2080 | 6646 | | 1634 | 1962 | 1812 | 2145 | 6788 |
| 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. | 3519614 | 3793699 | 3922015 | 4404870 | 5122075 | std::unordered_map<std::string, size_t> emplace & find std::string;void HashMapStdStr(benchmark::State& state) {
+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) {
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 | 3429563 | 3632923 | 5584695 | 5721296 | 6141653 | hashStrMapA<size_t> emplace & find ssa;void HashMapSimSsa(benchmark::State& state) {
+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) {
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 | 3526598 | 3697109 | 3523219 | 3899002 | 5107848 | 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 | 3647053 | 3829722 | 3479075 | 3927354 | 5120455 | 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 | 4067399 | 3939262 | 6362266 | 6299827 | 7187813 | | 4111005 | 3934639 | 6415411 | 6453271 | 7370000 |
| 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 | 660 | 812 | 1505 | 1577 | 5362 | Build func full name std::string 1;std::string build_full_name_std1() const {
+return values. The algorithm uses std::string. | 674 | 871 | 1503 | 1582 | 5735 | 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 += + + +. | 758 | 935 | 1501 | 1622 | 6029 | Build func full name std::stream;std::string build_full_name_stream() const {
++= 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 {
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 << | 2557 | 2527 | 8093 | 9579 | 25412 | Build func full name stringa;stringa build_full_name() const {
+We construct the function name through std::ostringstream and << | 2574 | 2633 | 8326 | 9706 | 25795 | 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. | 494 | 446 | 747 | 857 | 2926 | Build func full name stringa 1;stringa build_full_name1() const {
+Parameter information is appended to the current line. | 485 | 451 | 760 | 871 | 2962 | 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,11 +4351,52 @@ Parameter information is appended to the current line. | 607 | 624 | 898 | 1025 | 3417 | | 608 | 656 | 864 | 956 | 3450 |
| 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) { + static const auto& loc = std::locale("en_US.utf8"); + + for (auto _: state) { + std::wstring test = L"TestПриветTest"; + benchmark::DoNotOptimize(test); + + std::transform(test.begin(), test.end(), test.begin(), [](wchar_t s) { + return std::toupper(s, loc); + }); + + benchmark::DoNotOptimize(test); + #ifdef CHECK_RESULT + if (test != L"TESTПРИВЕТTEST") { + state.SkipWithError("Bad upper case"); + } + #endif + } +} | 151 | 165 | 1522 | 1452 | 1276 | |
| To upper case lstringw<15>void UpperCaseSim(benchmark::State& state) { + for (auto _: state) { + lstringw<15> test = L"TestПриветTest"; + benchmark::DoNotOptimize(test); + + test.upper(); + + benchmark::DoNotOptimize(test); + #ifdef CHECK_RESULT + if (test != L"TESTПРИВЕТTEST") { + state.SkipWithError("Bad upper case"); + } + #endif + } +} | 42.7 | 45.1 | 38.3 | 44.5 | 132 |