# Create Str from long literal (30 symbols)
@@ -662,7 +697,7 @@ 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...
18.8 | 19.3 | 74.9 | 77.5 | 16.5 |
+But how much slower is allocation under Windows than under Linux, 20 ns vs. 70 ns...
19.6 | 19.5 | 72.1 | 96.3 | 16.0 |
| std::string_view e = "123456789012345678901234567890";template<typename T>
void CreateLongLiteral(benchmark::State& state) {
for (auto _: state) {
@@ -672,14 +707,14 @@ 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.747 | 0.744 | 0.736 | 1.83 | 1.26 |
+remember the pointer to the text and its size.
0.771 | 0.744 | 0.734 | 2.06 | 1.28 |
| ssa e = "123456789012345678901234567890";template<typename T>
void CreateLongLiteral(benchmark::State& state) {
for (auto _: state) {
T empty_string{LONG_TEXT};
benchmark::DoNotOptimize(empty_string);
}
-} | | 0.370 | 0.735 | 0.365 | 1.83 | 1.01 |
+}
| 0.382 | 0.738 | 0.360 | 2.06 | 0.971 |
| stringa e = "123456789012345678901234567890";template<typename T>
void CreateLongLiteral(benchmark::State& state) {
for (auto _: state) {
@@ -687,7 +722,7 @@ void CreateLongLiteral(benchmark::State& state) {
benchmark::DoNotOptimize(empty_string);
}
} | >> stringa на константных литералах не отстает!
-stringa doesn't lag behind on constant literals! | 1.88 | 1.12 | 1.85 | 2.24 | 2.67 |
+stringa doesn't lag behind on constant literals!
1.13 | 1.11 | 1.08 | 3.00 | 2.18 |
| lstringa<20> e = "123456789012345678901234567890";template<typename T>
void CreateLongLiteral(benchmark::State& state) {
for (auto _: state) {
@@ -696,7 +731,7 @@ void CreateLongLiteral(benchmark::State& state) {
}
} | >> lstringa<20> может вместить в себя до 23 символов,
Очевидно, что для 30-и символов уже нужна аллокация.
-Obviously, 30 characters already require allocation. | 21.0 | 20.0 | 76.8 | 77.7 | 16.9 |
+Obviously, 30 characters already require allocation.
24.3 | 23.0 | 74.5 | 97.1 | 16.5 |
| lstringa<40> e = "123456789012345678901234567890";template<typename T>
void CreateLongLiteral(benchmark::State& state) {
for (auto _: state) {
@@ -706,14 +741,14 @@ 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.55 | 1.84 | 2.53 | 3.42 | 3.01 |
+bytes are simply copied.
2.60 | 1.96 | 2.52 | 3.65 | 3.00 |
# Create copy of Str with 30 symbols
@@ -802,7 +837,7 @@ void CopyLongString(benchmark::State& state) {
}
>> Копирования длинной строки вызывает аллокацию,
SSO уже не хватает. И снова как же отстаёт аллокация под Windows...
Copying a long string causes allocations,
-SSO is no longer sufficient. And again, how allocation lags under Windows... | 19.8 | 24.3 | 81.3 | 77.5 | 34.3 |
+SSO is no longer sufficient. And again, how allocation lags under Windows...
21.2 | 25.3 | 76.6 | 94.6 | 33.3 |
| std::string_view e = "123456789012345678901234567890"; auto c{e};template<typename T>
void CopyLongString(benchmark::State& state) {
T x = LONG_TEXT;
@@ -810,7 +845,7 @@ void CopyLongString(benchmark::State& state) {
T copy{x};
benchmark::DoNotOptimize(copy);
}
-} | | 0.752 | 0.724 | 0.741 | 1.88 | 1.25 |
+}
| 0.737 | 0.731 | 0.714 | 1.94 | 1.27 |
| ssa e = "123456789012345678901234567890"; auto c{e};template<typename T>
void CopyLongString(benchmark::State& state) {
T x = LONG_TEXT;
@@ -818,7 +853,7 @@ void CopyLongString(benchmark::State& state) {
T copy{x};
benchmark::DoNotOptimize(copy);
}
-} | | 0.375 | 0.752 | 0.362 | 1.83 | 1.01 |
+}
| 0.379 | 0.731 | 0.362 | 1.97 | 0.981 |
| stringa e = "123456789012345678901234567890"; auto c{e};template<typename T>
void CopyLongString(benchmark::State& state) {
T x = LONG_TEXT;
@@ -829,7 +864,7 @@ void CopyLongString(benchmark::State& state) {
} | >> А вот у stringa копирование литерала не зависит от его длины,
сравни с предыдущим бенчмарком.
But with stringa, literal copying doesn't depend on its length,
-compare with the previous benchmark. | 1.89 | 1.11 | 1.83 | 3.02 | 2.66 |
+compare with the previous benchmark.
1.13 | 1.13 | 1.84 | 3.36 | 2.19 |
| lstringa<20> e = "123456789012345678901234567890"; auto c{e};template<typename T>
void CopyLongString(benchmark::State& state) {
T x = LONG_TEXT;
@@ -838,7 +873,7 @@ void CopyLongString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
}
} | >> Не влезает, аллокация.
-Doesn't fit, allocation. | 21.0 | 20.1 | 76.1 | 79.3 | 17.2 |
+Doesn't fit, allocation.
20.7 | 22.5 | 79.1 | 97.1 | 15.7 |
| lstringa<40> e = "123456789012345678901234567890"; auto c{e};template<typename T>
void CopyLongString(benchmark::State& state) {
T x = LONG_TEXT;
@@ -847,14 +882,14 @@ void CopyLongString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
}
} | >> Уложили во внутренний буфер.
-Placed in the internal buffer. | 4.53 | 4.52 | 4.38 | 6.63 | 13.9 |
+Placed in the internal buffer.
4.48 | 4.61 | 4.46 | 8.16 | 14.2 |
# Copy not literal Str with N symbols
@@ -971,7 +1006,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-}
| 5.69 | 5.20 | 1.86 | 5.27 | 35.9 |
+}
| 4.98 | 5.03 | 1.80 | 4.91 | 34.4 |
| std::string copy{str_with_len_N};/16template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -985,7 +1020,7 @@ void CopyDynString(benchmark::State& state) {
SSO у std::string меньше, насколько я помню, 11 символов + 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.6 | 23.6 | 80.4 | 83.4 | 35.4 |
+smaller, as far as I remember: 11 characters + 0.
23.5 | 23.7 | 80.7 | 107 | 34.6 |
| std::string copy{str_with_len_N};/23template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -995,7 +1030,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(x);
}
} | >> Дальше просто добавляется время на копирование байтов.
-Then the time for copying bytes is simply added. | 24.0 | 23.0 | 78.0 | 82.9 | 36.3 |
+Then the time for copying bytes is simply added.
23.1 | 23.2 | 81.5 | 100 | 35.2 |
| std::string copy{str_with_len_N};/24template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1004,7 +1039,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | | 23.3 | 23.1 | 80.2 | 83.8 | 35.6 |
+}
| 23.1 | 23.2 | 79.1 | 104 | 34.8 |
| std::string copy{str_with_len_N};/32template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1013,7 +1048,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | | 23.2 | 23.4 | 82.7 | 88.0 | 39.4 |
+}
| 25.3 | 25.6 | 81.0 | 108 | 41.2 |
| std::string copy{str_with_len_N};/64template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1022,7 +1057,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | | 23.3 | 24.0 | 82.0 | 84.3 | 39.6 |
+}
| 22.7 | 24.7 | 82.1 | 113 | 37.9 |
| std::string copy{str_with_len_N};/128template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1031,7 +1066,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | | 25.2 | 24.5 | 89.8 | 87.8 | 41.3 |
+}
| 25.8 | 25.9 | 84.9 | 104 | 39.8 |
| std::string copy{str_with_len_N};/256template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1040,7 +1075,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | | 25.4 | 25.1 | 91.4 | 88.5 | 58.6 |
+}
| 24.6 | 25.5 | 84.9 | 110 | 59.6 |
| std::string copy{str_with_len_N};/512template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1049,7 +1084,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | | 29.9 | 29.0 | 89.2 | 91.6 | 53.9 |
+}
| 28.6 | 29.8 | 95.7 | 110 | 57.3 |
| std::string copy{str_with_len_N};/1024template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1058,7 +1093,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | | 44.1 | 44.3 | 96.8 | 99.9 | 53.1 |
+}
| 47.0 | 46.4 | 95.9 | 125 | 59.5 |
| std::string copy{str_with_len_N};/2048template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1067,7 +1102,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | | 130 | 130 | 130 | 129 | 77.9 |
+}
| 124 | 124 | 131 | 150 | 82.2 |
| std::string copy{str_with_len_N};/4096template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1077,7 +1112,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(x);
}
} | >> Чем длиннее строка, тем дольше создаётся копия.
-The longer the string, the longer it takes to create a copy. | 153 | 157 | 178 | 177 | 130 |
+The longer the string, the longer it takes to create a copy.
168 | 158 | 175 | 206 | 111 |
| stringa copy{str_with_len_N};/15template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1089,7 +1124,7 @@ void CopyDynString(benchmark::State& state) {
} | >> Здесь stringa инициализируется не литералом,
а значит, должна сама хранить символы.
Here, stringa is not initialized with a literal,
-meaning it must store characters itself. | 1.10 | 1.14 | 1.28 | 4.05 | 2.64 |
+meaning it must store characters itself.
1.10 | 1.12 | 1.31 | 4.44 | 2.54 |
| stringa copy{str_with_len_N};/16template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1103,7 +1138,7 @@ void CopyDynString(benchmark::State& state) {
инкремент заменён на обычный, судя по времени.
Under WASM, stringa has a 15-character SSO. Furthermore,
it was built without thread support, so the atomic
-increment was replaced with a regular one, judging by the time. | 1.10 | 1.10 | 1.28 | 4.03 | 4.98 |
+increment was replaced with a regular one, judging by the time.
1.11 | 1.13 | 1.29 | 4.43 | 4.81 |
| stringa copy{str_with_len_N};/23template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1115,7 +1150,7 @@ 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.10 | 1.11 | 1.28 | 4.10 | 5.00 |
+copies faster than 15 in std::string.
1.12 | 1.13 | 1.29 | 4.45 | 4.84 |
| stringa copy{str_with_len_N};/24template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1127,7 +1162,7 @@ void CopyDynString(benchmark::State& state) {
} | >> Всё, не влезаем в SSO, а значит, используем shared буфер.
Добавляется время на атомарный инкремент счётчика.
That's it, we're not using SSO, so we're using a shared buffer.
-Time is added for the atomic counter increment. | 16.7 | 16.2 | 15.8 | 18.5 | 5.02 |
+Time is added for the atomic counter increment.
16.1 | 16.1 | 15.8 | 19.1 | 4.89 |
| stringa copy{str_with_len_N};/32template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1136,7 +1171,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | | 16.0 | 16.3 | 15.7 | 18.5 | 4.98 |
+}
| 16.0 | 16.2 | 16.0 | 19.0 | 4.85 |
| stringa copy{str_with_len_N};/64template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1145,7 +1180,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | | 16.0 | 16.5 | 15.8 | 18.6 | 4.94 |
+}
| 16.1 | 16.6 | 15.7 | 19.0 | 4.83 |
| stringa copy{str_with_len_N};/128template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1154,7 +1189,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | | 16.0 | 16.4 | 15.8 | 18.5 | 4.99 |
+}
| 16.3 | 16.1 | 15.9 | 18.9 | 4.93 |
| stringa copy{str_with_len_N};/256template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1163,7 +1198,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | | 16.0 | 16.2 | 15.7 | 18.5 | 4.90 |
+}
| 16.1 | 16.1 | 16.0 | 19.2 | 4.97 |
| stringa copy{str_with_len_N};/512template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1172,7 +1207,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | | 16.0 | 16.3 | 15.7 | 18.4 | 5.01 |
+}
| 16.1 | 16.1 | 15.9 | 18.9 | 5.06 |
| stringa copy{str_with_len_N};/1024template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1181,7 +1216,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | | 16.0 | 16.3 | 15.7 | 18.9 | 5.07 |
+}
| 16.2 | 16.6 | 16.1 | 19.1 | 4.81 |
| stringa copy{str_with_len_N};/2048template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1190,7 +1225,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | | 16.1 | 16.4 | 15.9 | 18.4 | 5.01 |
+}
| 16.2 | 16.9 | 16.1 | 18.9 | 4.86 |
| stringa copy{str_with_len_N};/4096template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1202,7 +1237,7 @@ void CopyDynString(benchmark::State& state) {
} | >> И как видно, кроме инкремента нет накладных расходов,
время копирования не зависит от длины строки.
And as you can see, there are no overhead costs other than the
-increment; copying time does not depend on the string length. | 16.0 | 16.5 | 15.9 | 18.3 | 4.92 |
+increment; copying time does not depend on the string length.
16.5 | 16.5 | 16.0 | 19.1 | 4.76 |
| lstringa<16> copy{str_with_len_N};/15template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1214,7 +1249,7 @@ 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. | 4.12 | 4.51 | 4.88 | 7.84 | 14.1 |
+WASM has a 32-bit architecture, so SSO is up to 19 characters.
4.72 | 4.44 | 5.02 | 8.49 | 14.1 |
| lstringa<16> copy{str_with_len_N};/16template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1223,7 +1258,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | | 4.09 | 4.50 | 4.78 | 7.89 | 14.6 |
+}
| 4.56 | 4.46 | 4.96 | 8.68 | 13.9 |
| lstringa<16> copy{str_with_len_N};/23template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1232,7 +1267,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | | 4.04 | 4.56 | 4.80 | 7.73 | 31.6 |
+}
| 4.73 | 4.53 | 5.42 | 9.22 | 28.7 |
| lstringa<16> copy{str_with_len_N};/24template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1242,7 +1277,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(x);
}
} | >> И после начинает вести себя при копировании, как std::string.
-And then it starts to behave like std::string when copied. | 22.9 | 24.2 | 76.9 | 82.1 | 30.9 |
+And then it starts to behave like std::string when copied.
25.6 | 26.9 | 78.1 | 95.6 | 29.4 |
| lstringa<16> copy{str_with_len_N};/32template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1251,7 +1286,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | | 22.9 | 23.7 | 80.5 | 84.1 | 35.1 |
+}
| 24.1 | 23.8 | 84.7 | 103 | 31.9 |
| lstringa<16> copy{str_with_len_N};/64template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1260,7 +1295,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | | 24.1 | 25.4 | 81.7 | 84.8 | 34.9 |
+}
| 25.5 | 25.6 | 82.4 | 104 | 32.0 |
| lstringa<16> copy{str_with_len_N};/128template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1269,7 +1304,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | | 24.8 | 26.8 | 81.6 | 84.7 | 35.5 |
+}
| 29.0 | 27.1 | 87.2 | 109 | 32.6 |
| lstringa<16> copy{str_with_len_N};/256template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1278,7 +1313,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | | 26.0 | 27.8 | 83.0 | 649 | 54.3 |
+}
| 27.2 | 30.6 | 93.7 | 706 | 55.0 |
| lstringa<16> copy{str_with_len_N};/512template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1287,7 +1322,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | | 28.5 | 31.9 | 87.0 | 91.6 | 48.8 |
+}
| 30.4 | 30.0 | 93.0 | 108 | 51.9 |
| lstringa<16> copy{str_with_len_N};/1024template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1296,7 +1331,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | | 93.2 | 96.9 | 96.8 | 96.2 | 48.6 |
+}
| 105 | 98.8 | 99.6 | 122 | 54.2 |
| lstringa<16> copy{str_with_len_N};/2048template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1305,7 +1340,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | | 113 | 117 | 133 | 128 | 71.5 |
+}
| 120 | 118 | 127 | 149 | 79.1 |
| lstringa<16> copy{str_with_len_N};/4096template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1314,7 +1349,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | | 127 | 130 | 195 | 185 | 118 |
+}
| 134 | 135 | 198 | 211 | 106 |
| lstringa<512> copy{str_with_len_N};/15template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1323,7 +1358,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | | 4.48 | 5.23 | 5.12 | 8.54 | 15.2 |
+}
| 4.93 | 5.21 | 4.94 | 9.83 | 15.4 |
| lstringa<512> copy{str_with_len_N};/16template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1332,7 +1367,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | | 4.49 | 11.5 | 5.09 | 8.63 | 15.3 |
+}
| 5.05 | 5.22 | 4.93 | 10.2 | 15.5 |
| lstringa<512> copy{str_with_len_N};/23template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1341,7 +1376,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | | 4.43 | 11.7 | 5.25 | 8.58 | 14.6 |
+}
| 5.29 | 5.39 | 4.71 | 9.69 | 15.2 |
| lstringa<512> copy{str_with_len_N};/24template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1350,7 +1385,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | | 4.55 | 11.6 | 5.15 | 8.55 | 15.2 |
+}
| 5.07 | 5.85 | 4.87 | 10.2 | 15.0 |
| lstringa<512> copy{str_with_len_N};/32template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1359,7 +1394,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | | 4.12 | 20.0 | 7.92 | 11.5 | 17.8 |
+}
| 4.54 | 4.85 | 7.69 | 14.1 | 18.3 |
| lstringa<512> copy{str_with_len_N};/64template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1368,7 +1403,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | | 6.30 | 20.8 | 7.99 | 11.9 | 18.3 |
+}
| 6.08 | 7.00 | 7.79 | 13.7 | 17.7 |
| lstringa<512> copy{str_with_len_N};/128template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1377,7 +1412,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | | 6.07 | 23.4 | 8.43 | 12.1 | 18.8 |
+}
| 6.39 | 7.11 | 8.68 | 14.1 | 18.1 |
| lstringa<512> copy{str_with_len_N};/256template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1386,7 +1421,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | | 7.87 | 18.1 | 9.40 | 13.0 | 20.1 |
+}
| 8.42 | 16.4 | 9.48 | 15.2 | 20.7 |
| lstringa<512> copy{str_with_len_N};/512template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1398,7 +1433,7 @@ void CopyDynString(benchmark::State& state) {
} | >> Даже 512 символов копируются быстрее, чем
одна аллокация или атомарный инкремент.
Even 512 characters are copied faster than a single
-allocation or atomic increment. | 10.2 | 20.6 | 12.3 | 14.3 | 26.9 |
+allocation or atomic increment.
11.5 | 10.6 | 10.9 | 16.7 | 21.8 |
| lstringa<512> copy{str_with_len_N};/1024template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1408,7 +1443,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(x);
}
} | >> А дальше уже как у всех.
-And then it's like everyone else. | 95.5 | 96.9 | 94.1 | 97.2 | 48.0 |
+And then it's like everyone else.
94.1 | 98.4 | 98.5 | 112 | 52.9 |
| lstringa<512> copy{str_with_len_N};/2048template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1417,7 +1452,7 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | | 116 | 118 | 128 | 127 | 71.3 |
+}
| 112 | 117 | 132 | 153 | 76.5 |
| lstringa<512> copy{str_with_len_N};/4096template<typename T>
void CopyDynString(benchmark::State& state) {
T x(state.range(0), 'a');
@@ -1426,56 +1461,56 @@ void CopyDynString(benchmark::State& state) {
benchmark::DoNotOptimize(copy);
benchmark::DoNotOptimize(x);
}
-} | | 130 | 134 | 181 | 186 | 120 |
+}
| 129 | 137 | 199 | 208 | 105 |
# Convert to int '1234567'
@@ -1499,7 +1534,7 @@ void CopyDynString(benchmark::State& state) {
In simstr, a string fragment is sufficient for conversion to a number;
there's no need for null termination. The closest analog to this behavior
is "std::from_chars," but unfortunately, it is very limited in its capabilities.
-Here, I attempted to run tests that are similar in logic to std::from_chars.
27.5 | 27.4 | 30.8 | 32.2 | 69.5 |
+Here, I attempted to run tests that are similar in logic to std::from_chars.
26.8 | 28.4 | 31.8 | 38.8 | 73.0 |
| std::string_view s = "123456789"; std::from_chars(s.data(), s.data() + s.size(), res, 10);void ToIntFromChars10(benchmark::State& state, const std::string_view& s, int c) {
for (auto _: state) {
int res = 0;
@@ -1515,7 +1550,7 @@ 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. | 15.1 | 12.5 | 13.5 | 13.8 | 28.4 |
+signs, spaces, 0x prefixes, etc.
15.0 | 12.5 | 14.1 | 16.2 | 27.8 |
| 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) {
@@ -1532,7 +1567,7 @@ 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. | 12.4 | 8.24 | 14.1 | 15.7 | 19.0 |
+decimal system, no leading spaces, and no plus sign.
12.6 | 9.33 | 14.4 | 17.3 | 19.0 |
| 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) {
@@ -1546,7 +1581,7 @@ void ToIntSimStr10(benchmark::State& state, T t, int c) {
benchmark::DoNotOptimize(res);
benchmark::DoNotOptimize(t);
}
-} | | 12.2 | 7.94 | 13.5 | 15.1 | 17.3 |
+}
| 12.6 | 8.06 | 13.8 | 17.5 | 17.0 |
| 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) {
@@ -1560,13 +1595,13 @@ void ToIntSimStr10(benchmark::State& state, T t, int c) {
benchmark::DoNotOptimize(res);
benchmark::DoNotOptimize(t);
}
-} | | 12.4 | 8.34 | 13.6 | 16.1 | 17.4 |
+}
| 12.3 | 8.31 | 13.8 | 17.4 | 17.0 |
# Append text, number, text
@@ -2251,7 +2286,7 @@ void AppendLstring2String(benchmark::State& state) {
benchmark::DoNotOptimize(k);
}
}
-}
| 3102 | 2998 | 11067 | 11252 | 6369 |
+}
| 3053 | 3076 | 10665 | 13240 | 6486 |
| 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) {
@@ -2266,7 +2301,7 @@ void AppendLstring2String(benchmark::State& state) {
benchmark::DoNotOptimize(k);
}
}
-} | | 471 | 456 | 1078 | 1222 | 1655 |
+}
| 479 | 470 | 1052 | 1404 | 1576 |
| 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) {
@@ -2283,7 +2318,7 @@ void AppendLstring2String(benchmark::State& state) {
benchmark::DoNotOptimize(k);
}
}
-} | | 1395 | 1527 | 2776 | 2807 | 2916 |
+}
| 1412 | 1714 | 2789 | 3209 | 2894 |
| 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) {
@@ -2298,7 +2333,7 @@ void AppendLstring2String(benchmark::State& state) {
benchmark::DoNotOptimize(k);
}
}
-} | | 1205 | 1266 | 2001 | 2421 | 2078 |
+}
| 1208 | 1289 | 1904 | 2539 | 2063 |
| lstringa<8> str; str.format("test = {} times", k);template<typename T>
void AppendSimStrStrNumStrF(benchmark::State& state) {
for (auto _: state) {
@@ -2317,7 +2352,7 @@ void AppendSimStrStrNumStrF(benchmark::State& state) {
}
} | >> В simstr format с первого раза не помещается в такую строку без аллокации.
In simstr format, the first time it doesn't fit into such a
-string without allocation. | 1377 | 1633 | 2076 | 2671 | 3396 |
+string without allocation.
1379 | 1588 | 2168 | 3193 | 3409 |
| lstringa<32> str; str.format("test = {} times", k);template<typename T>
void AppendSimStrStrNumStrF(benchmark::State& state) {
for (auto _: state) {
@@ -2335,7 +2370,7 @@ void AppendSimStrStrNumStrF(benchmark::State& state) {
}
}
} | >> А в такую помещается. Используйте сразу буфера подходящего размера.
-And it fits in this one. Use buffers of the appropriate size right away. | 979 | 1117 | 1004 | 1531 | 2581 |
+And it fits in this one. Use buffers of the appropriate size right away.
1079 | 1059 | 1029 | 1659 | 2460 |
| lstringa<8> str = "test = " + k + " times";template<typename T>
void AppendSimStrStrNumStr(benchmark::State& state) {
for (auto _: state) {
@@ -2352,7 +2387,7 @@ void AppendSimStrStrNumStr(benchmark::State& state) {
}
}
} | >> Результат не помещается в SSO, возникает аллокация.
-The result does not fit into SSO, an allocation occurs. | 295 | 313 | 778 | 880 | 610 |
+The result does not fit into SSO, an allocation occurs.
313 | 332 | 807 | 975 | 611 |
| lstringa<32> str = "test = " + k + " times";template<typename T>
void AppendSimStrStrNumStr(benchmark::State& state) {
for (auto _: state) {
@@ -2371,7 +2406,7 @@ void AppendSimStrStrNumStr(benchmark::State& state) {
} | >> А здесь и ниже - результат укладывается в SSO.
Ещё раз - используйте сразу буфера подходящего размера.
And here and below, the result fits within SSO.
-Once again, use appropriately sized buffers from the start. | 152 | 153 | 154 | 187 | 342 |
+Once again, use appropriately sized buffers from the start.
154 | 160 | 155 | 217 | 345 |
| stringa str = "test = " + k + " times";template<typename T>
void AppendSimStrStrNumStr(benchmark::State& state) {
for (auto _: state) {
@@ -2390,17 +2425,17 @@ 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. | 150 | 162 | 152 | 236 | 562 |
+enough to accommodate the result, hence the long time.
145 | 167 | 151 | 276 | 541 |
# Replace All Str To Longer Size
@@ -3105,7 +3140,7 @@ void ReplaceAllLongerStdString(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-}
| 161 | 172 | 227 | 251 | 382 |
+}
| 160 | 164 | 232 | 249 | 371 |
| replace bb to ---- in std::string|256template<size_t Long>
void ReplaceAllLongerStdString(benchmark::State& state) {
std::string_view source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
@@ -3138,7 +3173,7 @@ void ReplaceAllLongerStdString(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | | 543 | 510 | 765 | 825 | 1410 |
+}
| 568 | 492 | 757 | 810 | 1351 |
| replace bb to ---- in std::string|512template<size_t Long>
void ReplaceAllLongerStdString(benchmark::State& state) {
std::string_view source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
@@ -3171,7 +3206,7 @@ void ReplaceAllLongerStdString(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | | 1041 | 989 | 1465 | 1501 | 2725 |
+}
| 1177 | 1119 | 1482 | 1556 | 2646 |
| replace bb to ---- in std::string|1024template<size_t Long>
void ReplaceAllLongerStdString(benchmark::State& state) {
std::string_view source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
@@ -3204,7 +3239,7 @@ void ReplaceAllLongerStdString(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | | 2329 | 2308 | 3193 | 3319 | 5829 |
+}
| 2294 | 2211 | 3150 | 3229 | 5606 |
| replace bb to ---- in std::string|2048template<size_t Long>
void ReplaceAllLongerStdString(benchmark::State& state) {
std::string_view source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
@@ -3237,7 +3272,7 @@ void ReplaceAllLongerStdString(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | | 5815 | 5824 | 7883 | 8393 | 12920 |
+}
| 5903 | 5959 | 8049 | 8174 | 12254 |
| replace bb to ---- in lstringa<8>|64template<size_t N, size_t Count>
void ReplaceAllLongerSimString(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
@@ -3259,7 +3294,7 @@ void ReplaceAllLongerSimString(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | | 143 | 161 | 320 | 330 | 339 |
+}
| 245 | 148 | 304 | 312 | 332 |
| replace bb to ---- in lstringa<8>|256template<size_t N, size_t Count>
void ReplaceAllLongerSimString(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
@@ -3281,7 +3316,7 @@ void ReplaceAllLongerSimString(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | | 439 | 462 | 629 | 692 | 1065 |
+}
| 777 | 485 | 606 | 660 | 1116 |
| replace bb to ---- in lstringa<8>|512template<size_t N, size_t Count>
void ReplaceAllLongerSimString(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
@@ -3303,7 +3338,7 @@ void ReplaceAllLongerSimString(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | | 833 | 882 | 1065 | 1154 | 1968 |
+}
| 1500 | 893 | 1054 | 1138 | 2117 |
| replace bb to ---- in lstringa<8>|1024template<size_t N, size_t Count>
void ReplaceAllLongerSimString(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
@@ -3325,7 +3360,7 @@ void ReplaceAllLongerSimString(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | | 1669 | 1827 | 1907 | 2102 | 3761 |
+}
| 2907 | 1845 | 1839 | 2056 | 4092 |
| replace bb to ---- in lstringa<8>|2048template<size_t N, size_t Count>
void ReplaceAllLongerSimString(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
@@ -3347,7 +3382,7 @@ void ReplaceAllLongerSimString(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | | 3123 | 3363 | 3579 | 3939 | 7335 |
+}
| 5929 | 3614 | 3503 | 3917 | 7783 |
| replace bb to ---- by init stringa|64template<size_t Count>
void ReplaceAllLongerSimStringExpr(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
@@ -3368,7 +3403,7 @@ void ReplaceAllLongerSimStringExpr(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | | 98.9 | 104 | 172 | 209 | 220 |
+}
| 129 | 110 | 183 | 206 | 212 |
| replace bb to ---- by init stringa|256template<size_t Count>
void ReplaceAllLongerSimStringExpr(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
@@ -3389,7 +3424,7 @@ void ReplaceAllLongerSimStringExpr(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | | 300 | 299 | 377 | 485 | 738 |
+}
| 356 | 305 | 374 | 475 | 725 |
| replace bb to ---- by init stringa|512template<size_t Count>
void ReplaceAllLongerSimStringExpr(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
@@ -3410,7 +3445,7 @@ void ReplaceAllLongerSimStringExpr(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | | 706 | 733 | 813 | 1086 | 1733 |
+}
| 774 | 751 | 824 | 1056 | 1687 |
| replace bb to ---- by init stringa|1024template<size_t Count>
void ReplaceAllLongerSimStringExpr(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
@@ -3431,7 +3466,7 @@ void ReplaceAllLongerSimStringExpr(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | | 1511 | 1625 | 1637 | 2232 | 3695 |
+}
| 1583 | 1630 | 1681 | 2152 | 3720 |
| replace bb to ---- by init stringa|2048template<size_t Count>
void ReplaceAllLongerSimStringExpr(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
@@ -3452,23 +3487,23 @@ void ReplaceAllLongerSimStringExpr(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | | 3078 | 3339 | 3090 | 4615 | 7436 |
+}
| 3395 | 3440 | 3111 | 4321 | 7469 |
# Replace All Str To Same Size
@@ -3504,7 +3539,7 @@ void ReplaceAllEqualStdString(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-}
| 121 | 115 | 190 | 209 | 270 |
+}
| 119 | 118 | 196 | 215 | 259 |
| replace bb to -- in std::string|256template<size_t Long>
void ReplaceAllEqualStdString(benchmark::State& state) {
std::string_view source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
@@ -3536,7 +3571,7 @@ void ReplaceAllEqualStdString(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | | 411 | 367 | 468 | 553 | 1011 |
+}
| 451 | 418 | 487 | 552 | 941 |
| replace bb to -- in std::string|512template<size_t Long>
void ReplaceAllEqualStdString(benchmark::State& state) {
std::string_view source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
@@ -3568,7 +3603,7 @@ void ReplaceAllEqualStdString(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | | 759 | 733 | 842 | 975 | 1878 |
+}
| 782 | 773 | 899 | 969 | 1842 |
| replace bb to -- in std::string|1024template<size_t Long>
void ReplaceAllEqualStdString(benchmark::State& state) {
std::string_view source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
@@ -3600,7 +3635,7 @@ void ReplaceAllEqualStdString(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | | 1460 | 1409 | 1614 | 1826 | 3626 |
+}
| 1492 | 1538 | 1687 | 1820 | 3695 |
| replace bb to -- in std::string|2048template<size_t Long>
void ReplaceAllEqualStdString(benchmark::State& state) {
std::string_view source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
@@ -3632,7 +3667,7 @@ void ReplaceAllEqualStdString(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | | 3052 | 2902 | 3157 | 3547 | 7194 |
+}
| 3010 | 2919 | 3148 | 3593 | 6890 |
| replace bb to -- in lstringa<8>|64template<size_t N, size_t Long>
void ReplaceAllEqualSimString(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
@@ -3653,7 +3688,7 @@ void ReplaceAllEqualSimString(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | | 99.0 | 103 | 185 | 189 | 222 |
+}
| 209 | 100 | 179 | 193 | 219 |
| replace bb to -- in lstringa<8>|256template<size_t N, size_t Long>
void ReplaceAllEqualSimString(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
@@ -3674,7 +3709,7 @@ void ReplaceAllEqualSimString(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | | 300 | 299 | 435 | 470 | 775 |
+}
| 855 | 298 | 440 | 465 | 797 |
| replace bb to -- in lstringa<8>|512template<size_t N, size_t Long>
void ReplaceAllEqualSimString(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
@@ -3695,7 +3730,7 @@ void ReplaceAllEqualSimString(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | | 552 | 548 | 763 | 807 | 1461 |
+}
| 1828 | 551 | 797 | 788 | 1465 |
| replace bb to -- in lstringa<8>|1024template<size_t N, size_t Long>
void ReplaceAllEqualSimString(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
@@ -3716,7 +3751,7 @@ void ReplaceAllEqualSimString(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | | 1147 | 1133 | 1404 | 1515 | 2776 |
+}
| 3661 | 1105 | 1542 | 1447 | 2845 |
| replace bb to -- in lstringa<8>|2048template<size_t N, size_t Long>
void ReplaceAllEqualSimString(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
@@ -3737,7 +3772,7 @@ void ReplaceAllEqualSimString(benchmark::State& state) {
benchmark::DoNotOptimize(result);
benchmark::DoNotOptimize(source);
}
-} | | 2183 | 2150 | 2741 | 2967 | 5522 |
+}
| 7670 | 2117 | 2927 | 2857 | 5530 |
| replace bb to -- by init stringa|64template<size_t Count>
void ReplaceAllEqualSimStringExpr(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
@@ -3762,7 +3797,7 @@ void ReplaceAllEqualSimStringExpr(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | | 82.4 | 93.9 | 162 | 179 | 180 |
+}
| 83.8 | 95.6 | 156 | 185 | 178 |
| replace bb to -- by init stringa|256template<size_t Count>
void ReplaceAllEqualSimStringExpr(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
@@ -3787,7 +3822,7 @@ void ReplaceAllEqualSimStringExpr(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | | 244 | 275 | 357 | 392 | 646 |
+}
| 236 | 270 | 349 | 387 | 634 |
| replace bb to -- by init stringa|512template<size_t Count>
void ReplaceAllEqualSimStringExpr(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
@@ -3812,7 +3847,7 @@ void ReplaceAllEqualSimStringExpr(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | | 444 | 498 | 580 | 642 | 1220 |
+}
| 485 | 553 | 583 | 651 | 1214 |
| replace bb to -- by init stringa|1024template<size_t Count>
void ReplaceAllEqualSimStringExpr(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
@@ -3837,7 +3872,7 @@ void ReplaceAllEqualSimStringExpr(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | | 886 | 1033 | 1091 | 1151 | 2371 |
+}
| 883 | 1031 | 1099 | 1196 | 2270 |
| replace bb to -- by init stringa|2048template<size_t Count>
void ReplaceAllEqualSimStringExpr(benchmark::State& state) {
ssa source = "aaaaaaaaaaaaaaaaaaabbbaaaaaaaabbbbaaaaabaaaaaaaaaaaaaaaaaaaaabba";
@@ -3862,23 +3897,23 @@ void ReplaceAllEqualSimStringExpr(benchmark::State& state) {
benchmark::DoNotOptimize(pattern);
benchmark::DoNotOptimize(repl);
}
-} | | 1707 | 1981 | 1998 | 2264 | 4604 |
+}
| 1717 | 1966 | 2073 | 2408 | 4529 |