56 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++03, c++11, c++1410 11#include <array>12#include <charconv>13#include <random>14 15#include "benchmark/benchmark.h"16#include "test_macros.h"17 18static 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 26static 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}33BENCHMARK(BM_to_chars_good)->DenseRange(2, 36, 1);34 35static 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}53BENCHMARK(BM_to_chars_bad)->DenseRange(2, 36, 1);54 55BENCHMARK_MAIN();56