//===----------------------------------------------------------------------===// // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include #include #include #include "benchmark/benchmark.h" #include "test_macros.h" static const std::array input = [] { std::mt19937 generator; std::uniform_int_distribution distribution(0, std::numeric_limits::max()); std::array result; std::generate_n(result.begin(), result.size(), [&] { return distribution(generator); }); return result; }(); static void BM_to_chars_good(benchmark::State& state) { char buffer[128]; int base = state.range(0); while (state.KeepRunningBatch(input.size())) for (auto value : input) benchmark::DoNotOptimize(std::to_chars(buffer, &buffer[128], value, base)); } BENCHMARK(BM_to_chars_good)->DenseRange(2, 36, 1); static void BM_to_chars_bad(benchmark::State& state) { char buffer[128]; int base = state.range(0); struct sample { unsigned size; unsigned value; }; std::array data; // Assume the failure occurs, on average, halfway during the conversion. std::transform(input.begin(), input.end(), data.begin(), [&](unsigned value) { std::to_chars_result result = std::to_chars(buffer, &buffer[128], value, base); return sample{unsigned((result.ptr - buffer) / 2), value}; }); while (state.KeepRunningBatch(data.size())) for (auto element : data) benchmark::DoNotOptimize(std::to_chars(buffer, &buffer[element.size], element.value, base)); } BENCHMARK(BM_to_chars_bad)->DenseRange(2, 36, 1); int main(int argc, char** argv) { benchmark::Initialize(&argc, argv); if (benchmark::ReportUnrecognizedArguments(argc, argv)) return 1; benchmark::RunSpecifiedBenchmarks(); }