xref: /llvm-project/libcxx/test/benchmarks/to_chars.bench.cpp (revision b2d2494731976ab7aa9702f3134472db694b9332)
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 
18 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 
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 
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