xref: /aosp_15_r20/external/abseil-cpp/absl/strings/numbers_benchmark.cc (revision 9356374a3709195abf420251b3e825997ff56c0f)
1*9356374aSAndroid Build Coastguard Worker // Copyright 2018 The Abseil Authors.
2*9356374aSAndroid Build Coastguard Worker //
3*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*9356374aSAndroid Build Coastguard Worker //
7*9356374aSAndroid Build Coastguard Worker //      https://www.apache.org/licenses/LICENSE-2.0
8*9356374aSAndroid Build Coastguard Worker //
9*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*9356374aSAndroid Build Coastguard Worker // limitations under the License.
14*9356374aSAndroid Build Coastguard Worker 
15*9356374aSAndroid Build Coastguard Worker #include <cstdint>
16*9356374aSAndroid Build Coastguard Worker #include <limits>
17*9356374aSAndroid Build Coastguard Worker #include <random>
18*9356374aSAndroid Build Coastguard Worker #include <string>
19*9356374aSAndroid Build Coastguard Worker #include <type_traits>
20*9356374aSAndroid Build Coastguard Worker #include <vector>
21*9356374aSAndroid Build Coastguard Worker 
22*9356374aSAndroid Build Coastguard Worker #include "benchmark/benchmark.h"
23*9356374aSAndroid Build Coastguard Worker #include "absl/base/internal/raw_logging.h"
24*9356374aSAndroid Build Coastguard Worker #include "absl/random/distributions.h"
25*9356374aSAndroid Build Coastguard Worker #include "absl/random/random.h"
26*9356374aSAndroid Build Coastguard Worker #include "absl/strings/numbers.h"
27*9356374aSAndroid Build Coastguard Worker #include "absl/strings/string_view.h"
28*9356374aSAndroid Build Coastguard Worker 
29*9356374aSAndroid Build Coastguard Worker namespace {
30*9356374aSAndroid Build Coastguard Worker 
31*9356374aSAndroid Build Coastguard Worker template <typename T>
BM_FastIntToBuffer(benchmark::State & state)32*9356374aSAndroid Build Coastguard Worker void BM_FastIntToBuffer(benchmark::State& state) {
33*9356374aSAndroid Build Coastguard Worker   const int inc = state.range(0);
34*9356374aSAndroid Build Coastguard Worker   char buf[absl::numbers_internal::kFastToBufferSize];
35*9356374aSAndroid Build Coastguard Worker   // Use the unsigned type to increment to take advantage of well-defined
36*9356374aSAndroid Build Coastguard Worker   // modular arithmetic.
37*9356374aSAndroid Build Coastguard Worker   typename std::make_unsigned<T>::type x = 0;
38*9356374aSAndroid Build Coastguard Worker   for (auto _ : state) {
39*9356374aSAndroid Build Coastguard Worker     absl::numbers_internal::FastIntToBuffer(static_cast<T>(x), buf);
40*9356374aSAndroid Build Coastguard Worker     x += inc;
41*9356374aSAndroid Build Coastguard Worker   }
42*9356374aSAndroid Build Coastguard Worker }
43*9356374aSAndroid Build Coastguard Worker BENCHMARK_TEMPLATE(BM_FastIntToBuffer, int32_t)->Range(0, 1 << 15);
44*9356374aSAndroid Build Coastguard Worker BENCHMARK_TEMPLATE(BM_FastIntToBuffer, int64_t)->Range(0, 1 << 30);
45*9356374aSAndroid Build Coastguard Worker 
46*9356374aSAndroid Build Coastguard Worker // Creates an integer that would be printed as `num_digits` repeated 7s in the
47*9356374aSAndroid Build Coastguard Worker // given `base`. `base` must be greater than or equal to 8.
RepeatedSevens(int num_digits,int base)48*9356374aSAndroid Build Coastguard Worker int64_t RepeatedSevens(int num_digits, int base) {
49*9356374aSAndroid Build Coastguard Worker   ABSL_RAW_CHECK(base >= 8, "");
50*9356374aSAndroid Build Coastguard Worker   int64_t num = 7;
51*9356374aSAndroid Build Coastguard Worker   while (--num_digits) num = base * num + 7;
52*9356374aSAndroid Build Coastguard Worker   return num;
53*9356374aSAndroid Build Coastguard Worker }
54*9356374aSAndroid Build Coastguard Worker 
BM_safe_strto32_string(benchmark::State & state)55*9356374aSAndroid Build Coastguard Worker void BM_safe_strto32_string(benchmark::State& state) {
56*9356374aSAndroid Build Coastguard Worker   const int digits = state.range(0);
57*9356374aSAndroid Build Coastguard Worker   const int base = state.range(1);
58*9356374aSAndroid Build Coastguard Worker   std::string str(digits, '7');  // valid in octal, decimal and hex
59*9356374aSAndroid Build Coastguard Worker   int32_t value = 0;
60*9356374aSAndroid Build Coastguard Worker   for (auto _ : state) {
61*9356374aSAndroid Build Coastguard Worker     benchmark::DoNotOptimize(
62*9356374aSAndroid Build Coastguard Worker         absl::numbers_internal::safe_strto32_base(str, &value, base));
63*9356374aSAndroid Build Coastguard Worker   }
64*9356374aSAndroid Build Coastguard Worker   ABSL_RAW_CHECK(value == RepeatedSevens(digits, base), "");
65*9356374aSAndroid Build Coastguard Worker }
66*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_safe_strto32_string)
67*9356374aSAndroid Build Coastguard Worker     ->ArgPair(1, 8)
68*9356374aSAndroid Build Coastguard Worker     ->ArgPair(1, 10)
69*9356374aSAndroid Build Coastguard Worker     ->ArgPair(1, 16)
70*9356374aSAndroid Build Coastguard Worker     ->ArgPair(2, 8)
71*9356374aSAndroid Build Coastguard Worker     ->ArgPair(2, 10)
72*9356374aSAndroid Build Coastguard Worker     ->ArgPair(2, 16)
73*9356374aSAndroid Build Coastguard Worker     ->ArgPair(4, 8)
74*9356374aSAndroid Build Coastguard Worker     ->ArgPair(4, 10)
75*9356374aSAndroid Build Coastguard Worker     ->ArgPair(4, 16)
76*9356374aSAndroid Build Coastguard Worker     ->ArgPair(8, 8)
77*9356374aSAndroid Build Coastguard Worker     ->ArgPair(8, 10)
78*9356374aSAndroid Build Coastguard Worker     ->ArgPair(8, 16)
79*9356374aSAndroid Build Coastguard Worker     ->ArgPair(10, 8)
80*9356374aSAndroid Build Coastguard Worker     ->ArgPair(9, 10);
81*9356374aSAndroid Build Coastguard Worker 
BM_safe_strto64_string(benchmark::State & state)82*9356374aSAndroid Build Coastguard Worker void BM_safe_strto64_string(benchmark::State& state) {
83*9356374aSAndroid Build Coastguard Worker   const int digits = state.range(0);
84*9356374aSAndroid Build Coastguard Worker   const int base = state.range(1);
85*9356374aSAndroid Build Coastguard Worker   std::string str(digits, '7');  // valid in octal, decimal and hex
86*9356374aSAndroid Build Coastguard Worker   int64_t value = 0;
87*9356374aSAndroid Build Coastguard Worker   for (auto _ : state) {
88*9356374aSAndroid Build Coastguard Worker     benchmark::DoNotOptimize(
89*9356374aSAndroid Build Coastguard Worker         absl::numbers_internal::safe_strto64_base(str, &value, base));
90*9356374aSAndroid Build Coastguard Worker   }
91*9356374aSAndroid Build Coastguard Worker   ABSL_RAW_CHECK(value == RepeatedSevens(digits, base), "");
92*9356374aSAndroid Build Coastguard Worker }
93*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_safe_strto64_string)
94*9356374aSAndroid Build Coastguard Worker     ->ArgPair(1, 8)
95*9356374aSAndroid Build Coastguard Worker     ->ArgPair(1, 10)
96*9356374aSAndroid Build Coastguard Worker     ->ArgPair(1, 16)
97*9356374aSAndroid Build Coastguard Worker     ->ArgPair(2, 8)
98*9356374aSAndroid Build Coastguard Worker     ->ArgPair(2, 10)
99*9356374aSAndroid Build Coastguard Worker     ->ArgPair(2, 16)
100*9356374aSAndroid Build Coastguard Worker     ->ArgPair(4, 8)
101*9356374aSAndroid Build Coastguard Worker     ->ArgPair(4, 10)
102*9356374aSAndroid Build Coastguard Worker     ->ArgPair(4, 16)
103*9356374aSAndroid Build Coastguard Worker     ->ArgPair(8, 8)
104*9356374aSAndroid Build Coastguard Worker     ->ArgPair(8, 10)
105*9356374aSAndroid Build Coastguard Worker     ->ArgPair(8, 16)
106*9356374aSAndroid Build Coastguard Worker     ->ArgPair(16, 8)
107*9356374aSAndroid Build Coastguard Worker     ->ArgPair(16, 10)
108*9356374aSAndroid Build Coastguard Worker     ->ArgPair(16, 16);
109*9356374aSAndroid Build Coastguard Worker 
BM_safe_strtou32_string(benchmark::State & state)110*9356374aSAndroid Build Coastguard Worker void BM_safe_strtou32_string(benchmark::State& state) {
111*9356374aSAndroid Build Coastguard Worker   const int digits = state.range(0);
112*9356374aSAndroid Build Coastguard Worker   const int base = state.range(1);
113*9356374aSAndroid Build Coastguard Worker   std::string str(digits, '7');  // valid in octal, decimal and hex
114*9356374aSAndroid Build Coastguard Worker   uint32_t value = 0;
115*9356374aSAndroid Build Coastguard Worker   for (auto _ : state) {
116*9356374aSAndroid Build Coastguard Worker     benchmark::DoNotOptimize(
117*9356374aSAndroid Build Coastguard Worker         absl::numbers_internal::safe_strtou32_base(str, &value, base));
118*9356374aSAndroid Build Coastguard Worker   }
119*9356374aSAndroid Build Coastguard Worker   ABSL_RAW_CHECK(value == RepeatedSevens(digits, base), "");
120*9356374aSAndroid Build Coastguard Worker }
121*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_safe_strtou32_string)
122*9356374aSAndroid Build Coastguard Worker     ->ArgPair(1, 8)
123*9356374aSAndroid Build Coastguard Worker     ->ArgPair(1, 10)
124*9356374aSAndroid Build Coastguard Worker     ->ArgPair(1, 16)
125*9356374aSAndroid Build Coastguard Worker     ->ArgPair(2, 8)
126*9356374aSAndroid Build Coastguard Worker     ->ArgPair(2, 10)
127*9356374aSAndroid Build Coastguard Worker     ->ArgPair(2, 16)
128*9356374aSAndroid Build Coastguard Worker     ->ArgPair(4, 8)
129*9356374aSAndroid Build Coastguard Worker     ->ArgPair(4, 10)
130*9356374aSAndroid Build Coastguard Worker     ->ArgPair(4, 16)
131*9356374aSAndroid Build Coastguard Worker     ->ArgPair(8, 8)
132*9356374aSAndroid Build Coastguard Worker     ->ArgPair(8, 10)
133*9356374aSAndroid Build Coastguard Worker     ->ArgPair(8, 16)
134*9356374aSAndroid Build Coastguard Worker     ->ArgPair(10, 8)
135*9356374aSAndroid Build Coastguard Worker     ->ArgPair(9, 10);
136*9356374aSAndroid Build Coastguard Worker 
BM_safe_strtou64_string(benchmark::State & state)137*9356374aSAndroid Build Coastguard Worker void BM_safe_strtou64_string(benchmark::State& state) {
138*9356374aSAndroid Build Coastguard Worker   const int digits = state.range(0);
139*9356374aSAndroid Build Coastguard Worker   const int base = state.range(1);
140*9356374aSAndroid Build Coastguard Worker   std::string str(digits, '7');  // valid in octal, decimal and hex
141*9356374aSAndroid Build Coastguard Worker   uint64_t value = 0;
142*9356374aSAndroid Build Coastguard Worker   for (auto _ : state) {
143*9356374aSAndroid Build Coastguard Worker     benchmark::DoNotOptimize(
144*9356374aSAndroid Build Coastguard Worker         absl::numbers_internal::safe_strtou64_base(str, &value, base));
145*9356374aSAndroid Build Coastguard Worker   }
146*9356374aSAndroid Build Coastguard Worker   ABSL_RAW_CHECK(value == RepeatedSevens(digits, base), "");
147*9356374aSAndroid Build Coastguard Worker }
148*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_safe_strtou64_string)
149*9356374aSAndroid Build Coastguard Worker     ->ArgPair(1, 8)
150*9356374aSAndroid Build Coastguard Worker     ->ArgPair(1, 10)
151*9356374aSAndroid Build Coastguard Worker     ->ArgPair(1, 16)
152*9356374aSAndroid Build Coastguard Worker     ->ArgPair(2, 8)
153*9356374aSAndroid Build Coastguard Worker     ->ArgPair(2, 10)
154*9356374aSAndroid Build Coastguard Worker     ->ArgPair(2, 16)
155*9356374aSAndroid Build Coastguard Worker     ->ArgPair(4, 8)
156*9356374aSAndroid Build Coastguard Worker     ->ArgPair(4, 10)
157*9356374aSAndroid Build Coastguard Worker     ->ArgPair(4, 16)
158*9356374aSAndroid Build Coastguard Worker     ->ArgPair(8, 8)
159*9356374aSAndroid Build Coastguard Worker     ->ArgPair(8, 10)
160*9356374aSAndroid Build Coastguard Worker     ->ArgPair(8, 16)
161*9356374aSAndroid Build Coastguard Worker     ->ArgPair(16, 8)
162*9356374aSAndroid Build Coastguard Worker     ->ArgPair(16, 10)
163*9356374aSAndroid Build Coastguard Worker     ->ArgPair(16, 16);
164*9356374aSAndroid Build Coastguard Worker 
165*9356374aSAndroid Build Coastguard Worker // Returns a vector of `num_strings` strings. Each string represents a
166*9356374aSAndroid Build Coastguard Worker // floating point number with `num_digits` digits before the decimal point and
167*9356374aSAndroid Build Coastguard Worker // another `num_digits` digits after.
MakeFloatStrings(int num_strings,int num_digits)168*9356374aSAndroid Build Coastguard Worker std::vector<std::string> MakeFloatStrings(int num_strings, int num_digits) {
169*9356374aSAndroid Build Coastguard Worker   // For convenience, use a random number generator to generate the test data.
170*9356374aSAndroid Build Coastguard Worker   // We don't actually need random properties, so use a fixed seed.
171*9356374aSAndroid Build Coastguard Worker   std::minstd_rand0 rng(1);
172*9356374aSAndroid Build Coastguard Worker   std::uniform_int_distribution<int> random_digit('0', '9');
173*9356374aSAndroid Build Coastguard Worker 
174*9356374aSAndroid Build Coastguard Worker   std::vector<std::string> float_strings(num_strings);
175*9356374aSAndroid Build Coastguard Worker   for (std::string& s : float_strings) {
176*9356374aSAndroid Build Coastguard Worker     s.reserve(2 * num_digits + 1);
177*9356374aSAndroid Build Coastguard Worker     for (int i = 0; i < num_digits; ++i) {
178*9356374aSAndroid Build Coastguard Worker       s.push_back(static_cast<char>(random_digit(rng)));
179*9356374aSAndroid Build Coastguard Worker     }
180*9356374aSAndroid Build Coastguard Worker     s.push_back('.');
181*9356374aSAndroid Build Coastguard Worker     for (int i = 0; i < num_digits; ++i) {
182*9356374aSAndroid Build Coastguard Worker       s.push_back(static_cast<char>(random_digit(rng)));
183*9356374aSAndroid Build Coastguard Worker     }
184*9356374aSAndroid Build Coastguard Worker   }
185*9356374aSAndroid Build Coastguard Worker   return float_strings;
186*9356374aSAndroid Build Coastguard Worker }
187*9356374aSAndroid Build Coastguard Worker 
188*9356374aSAndroid Build Coastguard Worker template <typename StringType>
GetStringAs(const std::string & s)189*9356374aSAndroid Build Coastguard Worker StringType GetStringAs(const std::string& s) {
190*9356374aSAndroid Build Coastguard Worker   return static_cast<StringType>(s);
191*9356374aSAndroid Build Coastguard Worker }
192*9356374aSAndroid Build Coastguard Worker template <>
GetStringAs(const std::string & s)193*9356374aSAndroid Build Coastguard Worker const char* GetStringAs<const char*>(const std::string& s) {
194*9356374aSAndroid Build Coastguard Worker   return s.c_str();
195*9356374aSAndroid Build Coastguard Worker }
196*9356374aSAndroid Build Coastguard Worker 
197*9356374aSAndroid Build Coastguard Worker template <typename StringType>
GetStringsAs(const std::vector<std::string> & strings)198*9356374aSAndroid Build Coastguard Worker std::vector<StringType> GetStringsAs(const std::vector<std::string>& strings) {
199*9356374aSAndroid Build Coastguard Worker   std::vector<StringType> result;
200*9356374aSAndroid Build Coastguard Worker   result.reserve(strings.size());
201*9356374aSAndroid Build Coastguard Worker   for (const std::string& s : strings) {
202*9356374aSAndroid Build Coastguard Worker     result.push_back(GetStringAs<StringType>(s));
203*9356374aSAndroid Build Coastguard Worker   }
204*9356374aSAndroid Build Coastguard Worker   return result;
205*9356374aSAndroid Build Coastguard Worker }
206*9356374aSAndroid Build Coastguard Worker 
207*9356374aSAndroid Build Coastguard Worker template <typename T>
BM_SimpleAtof(benchmark::State & state)208*9356374aSAndroid Build Coastguard Worker void BM_SimpleAtof(benchmark::State& state) {
209*9356374aSAndroid Build Coastguard Worker   const int num_strings = state.range(0);
210*9356374aSAndroid Build Coastguard Worker   const int num_digits = state.range(1);
211*9356374aSAndroid Build Coastguard Worker   std::vector<std::string> backing_strings =
212*9356374aSAndroid Build Coastguard Worker       MakeFloatStrings(num_strings, num_digits);
213*9356374aSAndroid Build Coastguard Worker   std::vector<T> inputs = GetStringsAs<T>(backing_strings);
214*9356374aSAndroid Build Coastguard Worker   float value;
215*9356374aSAndroid Build Coastguard Worker   for (auto _ : state) {
216*9356374aSAndroid Build Coastguard Worker     for (const T& input : inputs) {
217*9356374aSAndroid Build Coastguard Worker       benchmark::DoNotOptimize(absl::SimpleAtof(input, &value));
218*9356374aSAndroid Build Coastguard Worker     }
219*9356374aSAndroid Build Coastguard Worker   }
220*9356374aSAndroid Build Coastguard Worker }
221*9356374aSAndroid Build Coastguard Worker BENCHMARK_TEMPLATE(BM_SimpleAtof, absl::string_view)
222*9356374aSAndroid Build Coastguard Worker     ->ArgPair(10, 1)
223*9356374aSAndroid Build Coastguard Worker     ->ArgPair(10, 2)
224*9356374aSAndroid Build Coastguard Worker     ->ArgPair(10, 4)
225*9356374aSAndroid Build Coastguard Worker     ->ArgPair(10, 8);
226*9356374aSAndroid Build Coastguard Worker BENCHMARK_TEMPLATE(BM_SimpleAtof, const char*)
227*9356374aSAndroid Build Coastguard Worker     ->ArgPair(10, 1)
228*9356374aSAndroid Build Coastguard Worker     ->ArgPair(10, 2)
229*9356374aSAndroid Build Coastguard Worker     ->ArgPair(10, 4)
230*9356374aSAndroid Build Coastguard Worker     ->ArgPair(10, 8);
231*9356374aSAndroid Build Coastguard Worker BENCHMARK_TEMPLATE(BM_SimpleAtof, std::string)
232*9356374aSAndroid Build Coastguard Worker     ->ArgPair(10, 1)
233*9356374aSAndroid Build Coastguard Worker     ->ArgPair(10, 2)
234*9356374aSAndroid Build Coastguard Worker     ->ArgPair(10, 4)
235*9356374aSAndroid Build Coastguard Worker     ->ArgPair(10, 8);
236*9356374aSAndroid Build Coastguard Worker 
237*9356374aSAndroid Build Coastguard Worker template <typename T>
BM_SimpleAtod(benchmark::State & state)238*9356374aSAndroid Build Coastguard Worker void BM_SimpleAtod(benchmark::State& state) {
239*9356374aSAndroid Build Coastguard Worker   const int num_strings = state.range(0);
240*9356374aSAndroid Build Coastguard Worker   const int num_digits = state.range(1);
241*9356374aSAndroid Build Coastguard Worker   std::vector<std::string> backing_strings =
242*9356374aSAndroid Build Coastguard Worker       MakeFloatStrings(num_strings, num_digits);
243*9356374aSAndroid Build Coastguard Worker   std::vector<T> inputs = GetStringsAs<T>(backing_strings);
244*9356374aSAndroid Build Coastguard Worker   double value;
245*9356374aSAndroid Build Coastguard Worker   for (auto _ : state) {
246*9356374aSAndroid Build Coastguard Worker     for (const T& input : inputs) {
247*9356374aSAndroid Build Coastguard Worker       benchmark::DoNotOptimize(absl::SimpleAtod(input, &value));
248*9356374aSAndroid Build Coastguard Worker     }
249*9356374aSAndroid Build Coastguard Worker   }
250*9356374aSAndroid Build Coastguard Worker }
251*9356374aSAndroid Build Coastguard Worker BENCHMARK_TEMPLATE(BM_SimpleAtod, absl::string_view)
252*9356374aSAndroid Build Coastguard Worker     ->ArgPair(10, 1)
253*9356374aSAndroid Build Coastguard Worker     ->ArgPair(10, 2)
254*9356374aSAndroid Build Coastguard Worker     ->ArgPair(10, 4)
255*9356374aSAndroid Build Coastguard Worker     ->ArgPair(10, 8);
256*9356374aSAndroid Build Coastguard Worker BENCHMARK_TEMPLATE(BM_SimpleAtod, const char*)
257*9356374aSAndroid Build Coastguard Worker     ->ArgPair(10, 1)
258*9356374aSAndroid Build Coastguard Worker     ->ArgPair(10, 2)
259*9356374aSAndroid Build Coastguard Worker     ->ArgPair(10, 4)
260*9356374aSAndroid Build Coastguard Worker     ->ArgPair(10, 8);
261*9356374aSAndroid Build Coastguard Worker BENCHMARK_TEMPLATE(BM_SimpleAtod, std::string)
262*9356374aSAndroid Build Coastguard Worker     ->ArgPair(10, 1)
263*9356374aSAndroid Build Coastguard Worker     ->ArgPair(10, 2)
264*9356374aSAndroid Build Coastguard Worker     ->ArgPair(10, 4)
265*9356374aSAndroid Build Coastguard Worker     ->ArgPair(10, 8);
266*9356374aSAndroid Build Coastguard Worker 
BM_FastHexToBufferZeroPad16(benchmark::State & state)267*9356374aSAndroid Build Coastguard Worker void BM_FastHexToBufferZeroPad16(benchmark::State& state) {
268*9356374aSAndroid Build Coastguard Worker   absl::BitGen rng;
269*9356374aSAndroid Build Coastguard Worker   std::vector<uint64_t> nums;
270*9356374aSAndroid Build Coastguard Worker   nums.resize(1000);
271*9356374aSAndroid Build Coastguard Worker   auto min = std::numeric_limits<uint64_t>::min();
272*9356374aSAndroid Build Coastguard Worker   auto max = std::numeric_limits<uint64_t>::max();
273*9356374aSAndroid Build Coastguard Worker   for (auto& num : nums) {
274*9356374aSAndroid Build Coastguard Worker     num = absl::LogUniform(rng, min, max);
275*9356374aSAndroid Build Coastguard Worker   }
276*9356374aSAndroid Build Coastguard Worker 
277*9356374aSAndroid Build Coastguard Worker   char buf[16];
278*9356374aSAndroid Build Coastguard Worker   while (state.KeepRunningBatch(nums.size())) {
279*9356374aSAndroid Build Coastguard Worker     for (auto num : nums) {
280*9356374aSAndroid Build Coastguard Worker       auto digits = absl::numbers_internal::FastHexToBufferZeroPad16(num, buf);
281*9356374aSAndroid Build Coastguard Worker       benchmark::DoNotOptimize(digits);
282*9356374aSAndroid Build Coastguard Worker       benchmark::DoNotOptimize(buf);
283*9356374aSAndroid Build Coastguard Worker     }
284*9356374aSAndroid Build Coastguard Worker   }
285*9356374aSAndroid Build Coastguard Worker }
286*9356374aSAndroid Build Coastguard Worker BENCHMARK(BM_FastHexToBufferZeroPad16);
287*9356374aSAndroid Build Coastguard Worker 
288*9356374aSAndroid Build Coastguard Worker }  // namespace
289