xref: /aosp_15_r20/bionic/benchmarks/string_benchmark.cpp (revision 8d67ca893c1523eb926b9080dbe4e2ffd2a27ba1)
1*8d67ca89SAndroid Build Coastguard Worker /*
2*8d67ca89SAndroid Build Coastguard Worker  * Copyright (C) 2012 The Android Open Source Project
3*8d67ca89SAndroid Build Coastguard Worker  *
4*8d67ca89SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*8d67ca89SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*8d67ca89SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*8d67ca89SAndroid Build Coastguard Worker  *
8*8d67ca89SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*8d67ca89SAndroid Build Coastguard Worker  *
10*8d67ca89SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*8d67ca89SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*8d67ca89SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*8d67ca89SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*8d67ca89SAndroid Build Coastguard Worker  * limitations under the License.
15*8d67ca89SAndroid Build Coastguard Worker  */
16*8d67ca89SAndroid Build Coastguard Worker 
17*8d67ca89SAndroid Build Coastguard Worker #include <err.h>
18*8d67ca89SAndroid Build Coastguard Worker #include <stdint.h>
19*8d67ca89SAndroid Build Coastguard Worker #include <string.h>
20*8d67ca89SAndroid Build Coastguard Worker 
21*8d67ca89SAndroid Build Coastguard Worker #include <benchmark/benchmark.h>
22*8d67ca89SAndroid Build Coastguard Worker #include <util.h>
23*8d67ca89SAndroid Build Coastguard Worker 
BM_string_memcmp(benchmark::State & state)24*8d67ca89SAndroid Build Coastguard Worker static void BM_string_memcmp(benchmark::State& state) {
25*8d67ca89SAndroid Build Coastguard Worker   const size_t nbytes = state.range(0);
26*8d67ca89SAndroid Build Coastguard Worker   const size_t src_alignment = state.range(1);
27*8d67ca89SAndroid Build Coastguard Worker   const size_t dst_alignment = state.range(2);
28*8d67ca89SAndroid Build Coastguard Worker 
29*8d67ca89SAndroid Build Coastguard Worker   std::vector<char> src;
30*8d67ca89SAndroid Build Coastguard Worker   std::vector<char> dst;
31*8d67ca89SAndroid Build Coastguard Worker   char* src_aligned = GetAlignedPtrFilled(&src, src_alignment, nbytes, 'x');
32*8d67ca89SAndroid Build Coastguard Worker   char* dst_aligned = GetAlignedPtrFilled(&dst, dst_alignment, nbytes, 'x');
33*8d67ca89SAndroid Build Coastguard Worker 
34*8d67ca89SAndroid Build Coastguard Worker   while (state.KeepRunning()) {
35*8d67ca89SAndroid Build Coastguard Worker     benchmark::DoNotOptimize(memcmp(dst_aligned, src_aligned, nbytes));
36*8d67ca89SAndroid Build Coastguard Worker   }
37*8d67ca89SAndroid Build Coastguard Worker 
38*8d67ca89SAndroid Build Coastguard Worker   state.SetBytesProcessed(uint64_t(state.iterations()) * uint64_t(nbytes));
39*8d67ca89SAndroid Build Coastguard Worker }
40*8d67ca89SAndroid Build Coastguard Worker BIONIC_BENCHMARK_WITH_ARG(BM_string_memcmp, "AT_ALIGNED_TWOBUF");
41*8d67ca89SAndroid Build Coastguard Worker 
BM_string_memcpy(benchmark::State & state)42*8d67ca89SAndroid Build Coastguard Worker static void BM_string_memcpy(benchmark::State& state) {
43*8d67ca89SAndroid Build Coastguard Worker   const size_t nbytes = state.range(0);
44*8d67ca89SAndroid Build Coastguard Worker   const size_t src_alignment = state.range(1);
45*8d67ca89SAndroid Build Coastguard Worker   const size_t dst_alignment = state.range(2);
46*8d67ca89SAndroid Build Coastguard Worker 
47*8d67ca89SAndroid Build Coastguard Worker   std::vector<char> src;
48*8d67ca89SAndroid Build Coastguard Worker   std::vector<char> dst;
49*8d67ca89SAndroid Build Coastguard Worker   char* src_aligned = GetAlignedPtrFilled(&src, src_alignment, nbytes, 'x');
50*8d67ca89SAndroid Build Coastguard Worker   char* dst_aligned = GetAlignedPtr(&dst, dst_alignment, nbytes);
51*8d67ca89SAndroid Build Coastguard Worker 
52*8d67ca89SAndroid Build Coastguard Worker   while (state.KeepRunning()) {
53*8d67ca89SAndroid Build Coastguard Worker     memcpy(dst_aligned, src_aligned, nbytes);
54*8d67ca89SAndroid Build Coastguard Worker   }
55*8d67ca89SAndroid Build Coastguard Worker 
56*8d67ca89SAndroid Build Coastguard Worker   state.SetBytesProcessed(uint64_t(state.iterations()) * uint64_t(nbytes));
57*8d67ca89SAndroid Build Coastguard Worker }
58*8d67ca89SAndroid Build Coastguard Worker BIONIC_BENCHMARK_WITH_ARG(BM_string_memcpy, "AT_ALIGNED_TWOBUF");
59*8d67ca89SAndroid Build Coastguard Worker 
BM_string_memmove_non_overlapping(benchmark::State & state)60*8d67ca89SAndroid Build Coastguard Worker static void BM_string_memmove_non_overlapping(benchmark::State& state) {
61*8d67ca89SAndroid Build Coastguard Worker   const size_t nbytes = state.range(0);
62*8d67ca89SAndroid Build Coastguard Worker   const size_t src_alignment = state.range(1);
63*8d67ca89SAndroid Build Coastguard Worker   const size_t dst_alignment = state.range(2);
64*8d67ca89SAndroid Build Coastguard Worker 
65*8d67ca89SAndroid Build Coastguard Worker   std::vector<char> src;
66*8d67ca89SAndroid Build Coastguard Worker   std::vector<char> dst;
67*8d67ca89SAndroid Build Coastguard Worker   char* src_aligned = GetAlignedPtrFilled(&src, src_alignment, nbytes, 'x');
68*8d67ca89SAndroid Build Coastguard Worker   char* dst_aligned = GetAlignedPtrFilled(&dst, dst_alignment, nbytes, 'y');
69*8d67ca89SAndroid Build Coastguard Worker 
70*8d67ca89SAndroid Build Coastguard Worker   while (state.KeepRunning()) {
71*8d67ca89SAndroid Build Coastguard Worker     memmove(dst_aligned, src_aligned, nbytes);
72*8d67ca89SAndroid Build Coastguard Worker   }
73*8d67ca89SAndroid Build Coastguard Worker 
74*8d67ca89SAndroid Build Coastguard Worker   state.SetBytesProcessed(uint64_t(state.iterations()) * uint64_t(nbytes));
75*8d67ca89SAndroid Build Coastguard Worker }
76*8d67ca89SAndroid Build Coastguard Worker BIONIC_BENCHMARK_WITH_ARG(BM_string_memmove_non_overlapping, "AT_ALIGNED_TWOBUF");
77*8d67ca89SAndroid Build Coastguard Worker 
BM_string_memmove_overlap_dst_before_src(benchmark::State & state)78*8d67ca89SAndroid Build Coastguard Worker static void BM_string_memmove_overlap_dst_before_src(benchmark::State& state) {
79*8d67ca89SAndroid Build Coastguard Worker   const size_t nbytes = state.range(0);
80*8d67ca89SAndroid Build Coastguard Worker   const size_t alignment = state.range(1);
81*8d67ca89SAndroid Build Coastguard Worker 
82*8d67ca89SAndroid Build Coastguard Worker   std::vector<char> buf(3 * alignment + nbytes + 1, 'x');
83*8d67ca89SAndroid Build Coastguard Worker   char* buf_aligned = GetAlignedPtrFilled(&buf, alignment, nbytes + 1, 'x');
84*8d67ca89SAndroid Build Coastguard Worker 
85*8d67ca89SAndroid Build Coastguard Worker   while (state.KeepRunning()) {
86*8d67ca89SAndroid Build Coastguard Worker     memmove(buf_aligned, buf_aligned + 1, nbytes);  // Worst-case overlap.
87*8d67ca89SAndroid Build Coastguard Worker   }
88*8d67ca89SAndroid Build Coastguard Worker 
89*8d67ca89SAndroid Build Coastguard Worker   state.SetBytesProcessed(uint64_t(state.iterations()) * uint64_t(nbytes));
90*8d67ca89SAndroid Build Coastguard Worker }
91*8d67ca89SAndroid Build Coastguard Worker BIONIC_BENCHMARK_WITH_ARG(BM_string_memmove_overlap_dst_before_src, "AT_ALIGNED_ONEBUF");
92*8d67ca89SAndroid Build Coastguard Worker 
BM_string_memmove_overlap_src_before_dst(benchmark::State & state)93*8d67ca89SAndroid Build Coastguard Worker static void BM_string_memmove_overlap_src_before_dst(benchmark::State& state) {
94*8d67ca89SAndroid Build Coastguard Worker   const size_t nbytes = state.range(0);
95*8d67ca89SAndroid Build Coastguard Worker   const size_t alignment = state.range(1);
96*8d67ca89SAndroid Build Coastguard Worker 
97*8d67ca89SAndroid Build Coastguard Worker   std::vector<char> buf;
98*8d67ca89SAndroid Build Coastguard Worker   char* buf_aligned = GetAlignedPtrFilled(&buf, alignment, nbytes + 1, 'x');
99*8d67ca89SAndroid Build Coastguard Worker 
100*8d67ca89SAndroid Build Coastguard Worker   while (state.KeepRunning()) {
101*8d67ca89SAndroid Build Coastguard Worker     memmove(buf_aligned + 1, buf_aligned, nbytes);  // Worst-case overlap.
102*8d67ca89SAndroid Build Coastguard Worker   }
103*8d67ca89SAndroid Build Coastguard Worker 
104*8d67ca89SAndroid Build Coastguard Worker   state.SetBytesProcessed(uint64_t(state.iterations()) * uint64_t(nbytes));
105*8d67ca89SAndroid Build Coastguard Worker }
106*8d67ca89SAndroid Build Coastguard Worker BIONIC_BENCHMARK_WITH_ARG(BM_string_memmove_overlap_src_before_dst, "AT_ALIGNED_ONEBUF");
107*8d67ca89SAndroid Build Coastguard Worker 
BM_string_memset(benchmark::State & state)108*8d67ca89SAndroid Build Coastguard Worker static void BM_string_memset(benchmark::State& state) {
109*8d67ca89SAndroid Build Coastguard Worker   const size_t nbytes = state.range(0);
110*8d67ca89SAndroid Build Coastguard Worker   const size_t alignment = state.range(1);
111*8d67ca89SAndroid Build Coastguard Worker 
112*8d67ca89SAndroid Build Coastguard Worker   std::vector<char> buf;
113*8d67ca89SAndroid Build Coastguard Worker   char* buf_aligned = GetAlignedPtr(&buf, alignment, nbytes + 1);
114*8d67ca89SAndroid Build Coastguard Worker 
115*8d67ca89SAndroid Build Coastguard Worker   while (state.KeepRunning()) {
116*8d67ca89SAndroid Build Coastguard Worker     memset(buf_aligned, 0, nbytes);
117*8d67ca89SAndroid Build Coastguard Worker   }
118*8d67ca89SAndroid Build Coastguard Worker 
119*8d67ca89SAndroid Build Coastguard Worker   state.SetBytesProcessed(uint64_t(state.iterations()) * uint64_t(nbytes));
120*8d67ca89SAndroid Build Coastguard Worker }
121*8d67ca89SAndroid Build Coastguard Worker BIONIC_BENCHMARK_WITH_ARG(BM_string_memset, "AT_ALIGNED_ONEBUF");
122*8d67ca89SAndroid Build Coastguard Worker 
BM_string_strlen(benchmark::State & state)123*8d67ca89SAndroid Build Coastguard Worker static void BM_string_strlen(benchmark::State& state) {
124*8d67ca89SAndroid Build Coastguard Worker   const size_t nbytes = state.range(0);
125*8d67ca89SAndroid Build Coastguard Worker   const size_t alignment = state.range(1);
126*8d67ca89SAndroid Build Coastguard Worker 
127*8d67ca89SAndroid Build Coastguard Worker   std::vector<char> buf;
128*8d67ca89SAndroid Build Coastguard Worker   char* buf_aligned = GetAlignedPtrFilled(&buf, alignment, nbytes + 1, 'x');
129*8d67ca89SAndroid Build Coastguard Worker   buf_aligned[nbytes - 1] = '\0';
130*8d67ca89SAndroid Build Coastguard Worker 
131*8d67ca89SAndroid Build Coastguard Worker   while (state.KeepRunning()) {
132*8d67ca89SAndroid Build Coastguard Worker     benchmark::DoNotOptimize(strlen(buf_aligned));
133*8d67ca89SAndroid Build Coastguard Worker   }
134*8d67ca89SAndroid Build Coastguard Worker 
135*8d67ca89SAndroid Build Coastguard Worker   state.SetBytesProcessed(uint64_t(state.iterations()) * uint64_t(nbytes));
136*8d67ca89SAndroid Build Coastguard Worker }
137*8d67ca89SAndroid Build Coastguard Worker BIONIC_BENCHMARK_WITH_ARG(BM_string_strlen, "AT_ALIGNED_ONEBUF");
138*8d67ca89SAndroid Build Coastguard Worker 
BM_string_strcat_copy_only(benchmark::State & state)139*8d67ca89SAndroid Build Coastguard Worker static void BM_string_strcat_copy_only(benchmark::State& state) {
140*8d67ca89SAndroid Build Coastguard Worker   const size_t nbytes = state.range(0);
141*8d67ca89SAndroid Build Coastguard Worker   const size_t src_alignment = state.range(1);
142*8d67ca89SAndroid Build Coastguard Worker   const size_t dst_alignment = state.range(2);
143*8d67ca89SAndroid Build Coastguard Worker 
144*8d67ca89SAndroid Build Coastguard Worker   std::vector<char> src;
145*8d67ca89SAndroid Build Coastguard Worker   std::vector<char> dst;
146*8d67ca89SAndroid Build Coastguard Worker   char* src_aligned = GetAlignedPtrFilled(&src, src_alignment, nbytes, 'x');
147*8d67ca89SAndroid Build Coastguard Worker   char* dst_aligned = GetAlignedPtr(&dst, dst_alignment, nbytes + 2);
148*8d67ca89SAndroid Build Coastguard Worker   src_aligned[nbytes - 1] = '\0';
149*8d67ca89SAndroid Build Coastguard Worker   dst_aligned[0] = 'y';
150*8d67ca89SAndroid Build Coastguard Worker   dst_aligned[1] = 'y';
151*8d67ca89SAndroid Build Coastguard Worker   dst_aligned[2] = '\0';
152*8d67ca89SAndroid Build Coastguard Worker 
153*8d67ca89SAndroid Build Coastguard Worker   while (state.KeepRunning()) {
154*8d67ca89SAndroid Build Coastguard Worker     strcat(dst_aligned, src_aligned);
155*8d67ca89SAndroid Build Coastguard Worker     dst_aligned[2] = '\0';
156*8d67ca89SAndroid Build Coastguard Worker   }
157*8d67ca89SAndroid Build Coastguard Worker 
158*8d67ca89SAndroid Build Coastguard Worker   state.SetBytesProcessed(uint64_t(state.iterations()) * uint64_t(nbytes));
159*8d67ca89SAndroid Build Coastguard Worker }
160*8d67ca89SAndroid Build Coastguard Worker BIONIC_BENCHMARK_WITH_ARG(BM_string_strcat_copy_only, "AT_ALIGNED_TWOBUF");
161*8d67ca89SAndroid Build Coastguard Worker 
BM_string_strcat_seek_only(benchmark::State & state)162*8d67ca89SAndroid Build Coastguard Worker static void BM_string_strcat_seek_only(benchmark::State& state) {
163*8d67ca89SAndroid Build Coastguard Worker   const size_t nbytes = state.range(0);
164*8d67ca89SAndroid Build Coastguard Worker   const size_t src_alignment = state.range(1);
165*8d67ca89SAndroid Build Coastguard Worker   const size_t dst_alignment = state.range(2);
166*8d67ca89SAndroid Build Coastguard Worker 
167*8d67ca89SAndroid Build Coastguard Worker   std::vector<char> src;
168*8d67ca89SAndroid Build Coastguard Worker   std::vector<char> dst;
169*8d67ca89SAndroid Build Coastguard Worker   char* src_aligned = GetAlignedPtrFilled(&src, src_alignment, 3, 'x');
170*8d67ca89SAndroid Build Coastguard Worker   char* dst_aligned = GetAlignedPtrFilled(&dst, dst_alignment, nbytes + 2, 'y');
171*8d67ca89SAndroid Build Coastguard Worker   src_aligned[2] = '\0';
172*8d67ca89SAndroid Build Coastguard Worker   dst_aligned[nbytes - 1] = '\0';
173*8d67ca89SAndroid Build Coastguard Worker 
174*8d67ca89SAndroid Build Coastguard Worker   while (state.KeepRunning()) {
175*8d67ca89SAndroid Build Coastguard Worker     strcat(dst_aligned, src_aligned);
176*8d67ca89SAndroid Build Coastguard Worker     dst_aligned[nbytes - 1] = '\0';
177*8d67ca89SAndroid Build Coastguard Worker   }
178*8d67ca89SAndroid Build Coastguard Worker 
179*8d67ca89SAndroid Build Coastguard Worker   state.SetBytesProcessed(uint64_t(state.iterations()) * uint64_t(nbytes));
180*8d67ca89SAndroid Build Coastguard Worker }
181*8d67ca89SAndroid Build Coastguard Worker BIONIC_BENCHMARK_WITH_ARG(BM_string_strcat_seek_only, "AT_ALIGNED_TWOBUF");
182*8d67ca89SAndroid Build Coastguard Worker 
BM_string_strcat_half_copy_half_seek(benchmark::State & state)183*8d67ca89SAndroid Build Coastguard Worker static void BM_string_strcat_half_copy_half_seek(benchmark::State& state) {
184*8d67ca89SAndroid Build Coastguard Worker   const size_t nbytes = state.range(0);
185*8d67ca89SAndroid Build Coastguard Worker   const size_t src_alignment = state.range(1);
186*8d67ca89SAndroid Build Coastguard Worker   const size_t dst_alignment = state.range(2);
187*8d67ca89SAndroid Build Coastguard Worker 
188*8d67ca89SAndroid Build Coastguard Worker   // Skip sizes that don't make sense.
189*8d67ca89SAndroid Build Coastguard Worker   if ((nbytes / 2) == 0) {
190*8d67ca89SAndroid Build Coastguard Worker     return;
191*8d67ca89SAndroid Build Coastguard Worker   }
192*8d67ca89SAndroid Build Coastguard Worker 
193*8d67ca89SAndroid Build Coastguard Worker   std::vector<char> src;
194*8d67ca89SAndroid Build Coastguard Worker   std::vector<char> dst;
195*8d67ca89SAndroid Build Coastguard Worker   char* src_aligned = GetAlignedPtrFilled(&src, src_alignment, nbytes / 2, 'x');
196*8d67ca89SAndroid Build Coastguard Worker   char* dst_aligned = GetAlignedPtrFilled(&dst, dst_alignment, nbytes, 'y');
197*8d67ca89SAndroid Build Coastguard Worker   src_aligned[nbytes / 2 - 1] = '\0';
198*8d67ca89SAndroid Build Coastguard Worker   dst_aligned[nbytes / 2 - 1] = '\0';
199*8d67ca89SAndroid Build Coastguard Worker 
200*8d67ca89SAndroid Build Coastguard Worker   while (state.KeepRunning()) {
201*8d67ca89SAndroid Build Coastguard Worker     strcat(dst_aligned, src_aligned);
202*8d67ca89SAndroid Build Coastguard Worker     dst_aligned[nbytes / 2 - 1] = '\0';
203*8d67ca89SAndroid Build Coastguard Worker   }
204*8d67ca89SAndroid Build Coastguard Worker 
205*8d67ca89SAndroid Build Coastguard Worker   state.SetBytesProcessed(uint64_t(state.iterations()) * uint64_t(nbytes));
206*8d67ca89SAndroid Build Coastguard Worker }
207*8d67ca89SAndroid Build Coastguard Worker BIONIC_BENCHMARK_WITH_ARG(BM_string_strcat_half_copy_half_seek, "AT_ALIGNED_TWOBUF");
208*8d67ca89SAndroid Build Coastguard Worker 
BM_string_strcpy(benchmark::State & state)209*8d67ca89SAndroid Build Coastguard Worker static void BM_string_strcpy(benchmark::State& state) {
210*8d67ca89SAndroid Build Coastguard Worker   const size_t nbytes = state.range(0);
211*8d67ca89SAndroid Build Coastguard Worker   const size_t src_alignment = state.range(1);
212*8d67ca89SAndroid Build Coastguard Worker   const size_t dst_alignment = state.range(2);
213*8d67ca89SAndroid Build Coastguard Worker 
214*8d67ca89SAndroid Build Coastguard Worker   std::vector<char> src;
215*8d67ca89SAndroid Build Coastguard Worker   std::vector<char> dst;
216*8d67ca89SAndroid Build Coastguard Worker   char* src_aligned = GetAlignedPtrFilled(&src, src_alignment, nbytes, 'x');
217*8d67ca89SAndroid Build Coastguard Worker   char* dst_aligned = GetAlignedPtr(&dst, dst_alignment, nbytes);
218*8d67ca89SAndroid Build Coastguard Worker   src_aligned[nbytes - 1] = '\0';
219*8d67ca89SAndroid Build Coastguard Worker 
220*8d67ca89SAndroid Build Coastguard Worker   while (state.KeepRunning()) {
221*8d67ca89SAndroid Build Coastguard Worker     strcpy(dst_aligned, src_aligned);
222*8d67ca89SAndroid Build Coastguard Worker   }
223*8d67ca89SAndroid Build Coastguard Worker 
224*8d67ca89SAndroid Build Coastguard Worker   state.SetBytesProcessed(uint64_t(state.iterations()) * uint64_t(nbytes));
225*8d67ca89SAndroid Build Coastguard Worker }
226*8d67ca89SAndroid Build Coastguard Worker BIONIC_BENCHMARK_WITH_ARG(BM_string_strcpy, "AT_ALIGNED_TWOBUF");
227*8d67ca89SAndroid Build Coastguard Worker 
BM_string_strcmp(benchmark::State & state)228*8d67ca89SAndroid Build Coastguard Worker static void BM_string_strcmp(benchmark::State& state) {
229*8d67ca89SAndroid Build Coastguard Worker   const size_t nbytes = state.range(0);
230*8d67ca89SAndroid Build Coastguard Worker   const size_t s1_alignment = state.range(1);
231*8d67ca89SAndroid Build Coastguard Worker   const size_t s2_alignment = state.range(2);
232*8d67ca89SAndroid Build Coastguard Worker 
233*8d67ca89SAndroid Build Coastguard Worker   std::vector<char> s1;
234*8d67ca89SAndroid Build Coastguard Worker   std::vector<char> s2;
235*8d67ca89SAndroid Build Coastguard Worker   char* s1_aligned = GetAlignedPtrFilled(&s1, s1_alignment, nbytes, 'x');
236*8d67ca89SAndroid Build Coastguard Worker   char* s2_aligned = GetAlignedPtrFilled(&s2, s2_alignment, nbytes, 'x');
237*8d67ca89SAndroid Build Coastguard Worker   s1_aligned[nbytes - 1] = '\0';
238*8d67ca89SAndroid Build Coastguard Worker   s2_aligned[nbytes - 1] = '\0';
239*8d67ca89SAndroid Build Coastguard Worker 
240*8d67ca89SAndroid Build Coastguard Worker   while (state.KeepRunning()) {
241*8d67ca89SAndroid Build Coastguard Worker     benchmark::DoNotOptimize(strcmp(s1_aligned, s2_aligned));
242*8d67ca89SAndroid Build Coastguard Worker   }
243*8d67ca89SAndroid Build Coastguard Worker 
244*8d67ca89SAndroid Build Coastguard Worker   state.SetBytesProcessed(uint64_t(state.iterations()) * uint64_t(nbytes));
245*8d67ca89SAndroid Build Coastguard Worker }
246*8d67ca89SAndroid Build Coastguard Worker BIONIC_BENCHMARK_WITH_ARG(BM_string_strcmp, "AT_ALIGNED_TWOBUF");
247*8d67ca89SAndroid Build Coastguard Worker 
BM_string_strncmp(benchmark::State & state)248*8d67ca89SAndroid Build Coastguard Worker static void BM_string_strncmp(benchmark::State& state) {
249*8d67ca89SAndroid Build Coastguard Worker   const size_t nbytes = state.range(0);
250*8d67ca89SAndroid Build Coastguard Worker   const size_t s1_alignment = state.range(1);
251*8d67ca89SAndroid Build Coastguard Worker   const size_t s2_alignment = state.range(2);
252*8d67ca89SAndroid Build Coastguard Worker 
253*8d67ca89SAndroid Build Coastguard Worker   std::vector<char> s1;
254*8d67ca89SAndroid Build Coastguard Worker   std::vector<char> s2;
255*8d67ca89SAndroid Build Coastguard Worker   char* s1_aligned = GetAlignedPtrFilled(&s1, s1_alignment, nbytes, 'x');
256*8d67ca89SAndroid Build Coastguard Worker   char* s2_aligned = GetAlignedPtrFilled(&s2, s2_alignment, nbytes, 'x');
257*8d67ca89SAndroid Build Coastguard Worker 
258*8d67ca89SAndroid Build Coastguard Worker   for (auto _ : state) {
259*8d67ca89SAndroid Build Coastguard Worker     benchmark::DoNotOptimize(strncmp(s1_aligned, s2_aligned, nbytes));
260*8d67ca89SAndroid Build Coastguard Worker   }
261*8d67ca89SAndroid Build Coastguard Worker 
262*8d67ca89SAndroid Build Coastguard Worker   state.SetBytesProcessed(uint64_t(state.iterations()) * uint64_t(nbytes));
263*8d67ca89SAndroid Build Coastguard Worker }
264*8d67ca89SAndroid Build Coastguard Worker BIONIC_BENCHMARK_WITH_ARG(BM_string_strncmp, "AT_ALIGNED_TWOBUF");
265*8d67ca89SAndroid Build Coastguard Worker 
BM_string_strstr(benchmark::State & state)266*8d67ca89SAndroid Build Coastguard Worker static void BM_string_strstr(benchmark::State& state) {
267*8d67ca89SAndroid Build Coastguard Worker   const size_t nbytes = state.range(0);
268*8d67ca89SAndroid Build Coastguard Worker   const size_t haystack_alignment = state.range(1);
269*8d67ca89SAndroid Build Coastguard Worker   const size_t needle_alignment = state.range(2);
270*8d67ca89SAndroid Build Coastguard Worker 
271*8d67ca89SAndroid Build Coastguard Worker   std::vector<char> haystack;
272*8d67ca89SAndroid Build Coastguard Worker   std::vector<char> needle;
273*8d67ca89SAndroid Build Coastguard Worker   char* haystack_aligned = GetAlignedPtrFilled(&haystack, haystack_alignment, nbytes, 'x');
274*8d67ca89SAndroid Build Coastguard Worker   char* needle_aligned = GetAlignedPtrFilled(&needle, needle_alignment,
275*8d67ca89SAndroid Build Coastguard Worker                                              std::min(nbytes, static_cast<size_t>(5)), 'x');
276*8d67ca89SAndroid Build Coastguard Worker 
277*8d67ca89SAndroid Build Coastguard Worker   if (nbytes / 4 > 2) {
278*8d67ca89SAndroid Build Coastguard Worker     for (size_t i = 0; nbytes / 4 >= 2 && i < nbytes / 4 - 2; i++) {
279*8d67ca89SAndroid Build Coastguard Worker       haystack_aligned[4 * i + 3] = 'y';
280*8d67ca89SAndroid Build Coastguard Worker     }
281*8d67ca89SAndroid Build Coastguard Worker   }
282*8d67ca89SAndroid Build Coastguard Worker   haystack_aligned[nbytes - 1] = '\0';
283*8d67ca89SAndroid Build Coastguard Worker   needle_aligned[needle.size() - 1] = '\0';
284*8d67ca89SAndroid Build Coastguard Worker 
285*8d67ca89SAndroid Build Coastguard Worker   while (state.KeepRunning()) {
286*8d67ca89SAndroid Build Coastguard Worker     if (strstr(haystack_aligned, needle_aligned) == nullptr) {
287*8d67ca89SAndroid Build Coastguard Worker       errx(1, "ERROR: strstr failed to find valid substring.");
288*8d67ca89SAndroid Build Coastguard Worker     }
289*8d67ca89SAndroid Build Coastguard Worker   }
290*8d67ca89SAndroid Build Coastguard Worker 
291*8d67ca89SAndroid Build Coastguard Worker   state.SetBytesProcessed(uint64_t(state.iterations()) * uint64_t(nbytes));
292*8d67ca89SAndroid Build Coastguard Worker }
293*8d67ca89SAndroid Build Coastguard Worker BIONIC_BENCHMARK_WITH_ARG(BM_string_strstr, "AT_ALIGNED_TWOBUF");
294*8d67ca89SAndroid Build Coastguard Worker 
BM_string_strchr(benchmark::State & state)295*8d67ca89SAndroid Build Coastguard Worker static void BM_string_strchr(benchmark::State& state) {
296*8d67ca89SAndroid Build Coastguard Worker   const size_t nbytes = state.range(0);
297*8d67ca89SAndroid Build Coastguard Worker   const size_t haystack_alignment = state.range(1);
298*8d67ca89SAndroid Build Coastguard Worker 
299*8d67ca89SAndroid Build Coastguard Worker   std::vector<char> haystack;
300*8d67ca89SAndroid Build Coastguard Worker   char* haystack_aligned = GetAlignedPtrFilled(&haystack, haystack_alignment, nbytes, 'x');
301*8d67ca89SAndroid Build Coastguard Worker   haystack_aligned[nbytes-1] = '\0';
302*8d67ca89SAndroid Build Coastguard Worker 
303*8d67ca89SAndroid Build Coastguard Worker   while (state.KeepRunning()) {
304*8d67ca89SAndroid Build Coastguard Worker     if (strchr(haystack_aligned, 'y') != nullptr) {
305*8d67ca89SAndroid Build Coastguard Worker       errx(1, "ERROR: strchr found a chr where it should have failed.");
306*8d67ca89SAndroid Build Coastguard Worker     }
307*8d67ca89SAndroid Build Coastguard Worker   }
308*8d67ca89SAndroid Build Coastguard Worker 
309*8d67ca89SAndroid Build Coastguard Worker   state.SetBytesProcessed(uint64_t(state.iterations()) * uint64_t(nbytes));
310*8d67ca89SAndroid Build Coastguard Worker }
311*8d67ca89SAndroid Build Coastguard Worker BIONIC_BENCHMARK_WITH_ARG(BM_string_strchr, "AT_ALIGNED_ONEBUF");
312