15 #include "absl/strings/str_cat.h"
20 #include "benchmark/benchmark.h"
21 #include "absl/strings/substitute.h"
25 const char kStringOne[] =
"Once Upon A Time, ";
26 const char kStringTwo[] =
"There was a string benchmark";
30 inline int IncrementAlternatingSign(
int i) {
31 return i > 0 ? -
i : 1 -
i;
41 for (
char*
f = &
foo[0]; *
f != 0; ++
f) {
45 i = IncrementAlternatingSign(
i);
54 snprintf(on_stack,
sizeof(on_stack),
"%s %s:%d", kStringOne, kStringTwo,
i);
55 i = IncrementAlternatingSign(
i);
66 i = IncrementAlternatingSign(
i);
80 i = IncrementAlternatingSign(
i);
90 i = IncrementAlternatingSign(
i);
101 i = IncrementAlternatingSign(
i);
110 "$0 $1", kStringOne,
reinterpret_cast<void*
>(
int64_t{
i} + 0x10000000));
112 i = IncrementAlternatingSign(
i);
123 i = IncrementAlternatingSign(
i);
135 i = IncrementAlternatingSign(
i);
138 BENCHMARK(BM_DoubleToString_By_SixDigits);
140 template <
typename... Chunks>
143 for (
auto s :
state) {
145 while (
result.size() < total_bytes) {
153 const int total_bytes =
state.range(0);
154 const int chunks_at_a_time =
state.range(1);
157 switch (chunks_at_a_time) {
159 return BM_StrAppendImpl(
state, total_bytes, kChunk);
161 return BM_StrAppendImpl(
state, total_bytes, kChunk, kChunk);
163 return BM_StrAppendImpl(
state, total_bytes, kChunk, kChunk, kChunk,
166 return BM_StrAppendImpl(
state, total_bytes, kChunk, kChunk, kChunk,
167 kChunk, kChunk, kChunk, kChunk, kChunk);
173 template <
typename B>
175 for (
int bytes : {10, 100, 1000, 10000}) {
176 for (
int chunks : {1, 2, 4, 8}) {
178 if (
bytes % (10 * chunks) == 0) {
185 BENCHMARK(BM_StrAppend)->Apply(StrAppendConfig);