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