xref: /openbsd-src/gnu/llvm/libcxx/benchmarks/to_chars.bench.cpp (revision 76d0caaeb19ae0808d90af1d0b3b7b50b3e5383f)
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