|  | //===----------------------------------------------------------------------===// | 
|  | // 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 <array> | 
|  | #include <charconv> | 
|  | #include <random> | 
|  |  | 
|  | #include "benchmark/benchmark.h" | 
|  | #include "test_macros.h" | 
|  |  | 
|  | static const std::array<unsigned, 1000> input = [] { | 
|  | std::mt19937 generator; | 
|  | std::uniform_int_distribution<unsigned> distribution(0, std::numeric_limits<unsigned>::max()); | 
|  | std::array<unsigned, 1000> 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<sample, 1000> 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(); | 
|  | } |