59 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===----------------------------------------------------------------------===//
 | |
| // 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();
 | |
| }
 |