brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.9 KiB · cee969c Raw
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