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