1*4d6fc14bSjoerg //===----------------------------------------------------------------------===//
2*4d6fc14bSjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
3*4d6fc14bSjoerg // See https://llvm.org/LICENSE.txt for license information.
4*4d6fc14bSjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
5*4d6fc14bSjoerg //
6*4d6fc14bSjoerg //===----------------------------------------------------------------------===//
7*4d6fc14bSjoerg
8*4d6fc14bSjoerg #include <array>
9*4d6fc14bSjoerg #include <charconv>
10*4d6fc14bSjoerg #include <random>
11*4d6fc14bSjoerg
12*4d6fc14bSjoerg #include "benchmark/benchmark.h"
13*4d6fc14bSjoerg #include "test_macros.h"
14*4d6fc14bSjoerg
__anon30f8aed20102null15*4d6fc14bSjoerg static const std::array<unsigned, 1000> input = [] {
16*4d6fc14bSjoerg std::mt19937 generator;
17*4d6fc14bSjoerg std::uniform_int_distribution<unsigned> distribution(0, std::numeric_limits<unsigned>::max());
18*4d6fc14bSjoerg std::array<unsigned, 1000> result;
19*4d6fc14bSjoerg std::generate_n(result.begin(), result.size(), [&] { return distribution(generator); });
20*4d6fc14bSjoerg return result;
21*4d6fc14bSjoerg }();
22*4d6fc14bSjoerg
BM_to_chars_good(benchmark::State & state)23*4d6fc14bSjoerg static void BM_to_chars_good(benchmark::State& state) {
24*4d6fc14bSjoerg char buffer[128];
25*4d6fc14bSjoerg int base = state.range(0);
26*4d6fc14bSjoerg while (state.KeepRunningBatch(input.size()))
27*4d6fc14bSjoerg for (auto value : input)
28*4d6fc14bSjoerg benchmark::DoNotOptimize(std::to_chars(buffer, &buffer[128], value, base));
29*4d6fc14bSjoerg }
30*4d6fc14bSjoerg BENCHMARK(BM_to_chars_good)->DenseRange(2, 36, 1);
31*4d6fc14bSjoerg
BM_to_chars_bad(benchmark::State & state)32*4d6fc14bSjoerg static void BM_to_chars_bad(benchmark::State& state) {
33*4d6fc14bSjoerg char buffer[128];
34*4d6fc14bSjoerg int base = state.range(0);
35*4d6fc14bSjoerg struct sample {
36*4d6fc14bSjoerg unsigned size;
37*4d6fc14bSjoerg unsigned value;
38*4d6fc14bSjoerg };
39*4d6fc14bSjoerg std::array<sample, 1000> data;
40*4d6fc14bSjoerg // Assume the failure occurs, on average, halfway during the conversion.
41*4d6fc14bSjoerg std::transform(input.begin(), input.end(), data.begin(), [&](unsigned value) {
42*4d6fc14bSjoerg std::to_chars_result result = std::to_chars(buffer, &buffer[128], value, base);
43*4d6fc14bSjoerg return sample{unsigned((result.ptr - buffer) / 2), value};
44*4d6fc14bSjoerg });
45*4d6fc14bSjoerg
46*4d6fc14bSjoerg while (state.KeepRunningBatch(data.size()))
47*4d6fc14bSjoerg for (auto element : data)
48*4d6fc14bSjoerg benchmark::DoNotOptimize(std::to_chars(buffer, &buffer[element.size], element.value, base));
49*4d6fc14bSjoerg }
50*4d6fc14bSjoerg BENCHMARK(BM_to_chars_bad)->DenseRange(2, 36, 1);
51*4d6fc14bSjoerg
main(int argc,char ** argv)52*4d6fc14bSjoerg int main(int argc, char** argv) {
53*4d6fc14bSjoerg benchmark::Initialize(&argc, argv);
54*4d6fc14bSjoerg if (benchmark::ReportUnrecognizedArguments(argc, argv))
55*4d6fc14bSjoerg return 1;
56*4d6fc14bSjoerg
57*4d6fc14bSjoerg benchmark::RunSpecifiedBenchmarks();
58*4d6fc14bSjoerg }
59