15 #include "absl/strings/internal/memutil.h"
20 #include "benchmark/benchmark.h"
21 #include "absl/strings/ascii.h"
87 constexpr
int kHaystackSize = 10000;
88 constexpr
int64_t kHaystackSize64 = kHaystackSize;
89 const char* MakeHaystack() {
90 char* haystack =
new char[kHaystackSize];
91 for (
int i = 0;
i < kHaystackSize - 1; ++
i) haystack[
i] =
'a';
92 haystack[kHaystackSize - 1] =
'b';
95 const char*
const kHaystack = MakeHaystack();
102 state.SetBytesProcessed(kHaystackSize64 *
state.iterations());
111 state.SetBytesProcessed(kHaystackSize64 *
state.iterations());
118 kHaystack, kHaystackSize, kHaystack + kHaystackSize / 2,
119 kHaystackSize - kHaystackSize / 2));
121 state.SetBytesProcessed(kHaystackSize64 *
state.iterations());
130 state.SetBytesProcessed(kHaystackSize64 *
state.iterations());
139 state.SetBytesProcessed(kHaystackSize64 *
state.iterations());
146 kHaystack, kHaystackSize, kHaystack + kHaystackSize / 2,
147 kHaystackSize - kHaystackSize / 2));
149 state.SetBytesProcessed(kHaystackSize64 *
state.iterations());
153 bool case_eq(
const char a,
const char b) {
160 kHaystack + kHaystackSize - 1,
161 kHaystack + kHaystackSize));
163 state.SetBytesProcessed(kHaystackSize64 *
state.iterations());
170 kHaystack + kHaystackSize - 2,
171 kHaystack + kHaystackSize));
173 state.SetBytesProcessed(kHaystackSize64 *
state.iterations());
180 kHaystack + kHaystackSize / 2,
181 kHaystack + kHaystackSize));
183 state.SetBytesProcessed(kHaystackSize64 *
state.iterations());
190 kHaystack + kHaystackSize - 1,
191 kHaystack + kHaystackSize, case_eq));
193 state.SetBytesProcessed(kHaystackSize64 *
state.iterations());
200 kHaystack + kHaystackSize - 2,
201 kHaystack + kHaystackSize, case_eq));
203 state.SetBytesProcessed(kHaystackSize64 *
state.iterations());
210 kHaystack + kHaystackSize / 2,
211 kHaystack + kHaystackSize, case_eq));
213 state.SetBytesProcessed(kHaystackSize64 *
state.iterations());
217 char* memcasechr(
const char* s,
int c,
size_t slen) {
219 for (; slen; ++
s, --slen) {
225 const char* memcasematch(
const char* phaystack,
size_t haylen,
226 const char* pneedle,
size_t neelen) {
230 if (haylen < neelen)
return nullptr;
233 const char* hayend = phaystack + haylen - neelen + 1;
234 while ((
match =
static_cast<char*
>(
235 memcasechr(phaystack, pneedle[0], hayend - phaystack)))) {
239 phaystack =
match + 1;
249 state.SetBytesProcessed(kHaystackSize64 *
state.iterations());
258 state.SetBytesProcessed(kHaystackSize64 *
state.iterations());
265 kHaystack, kHaystackSize, kHaystack + kHaystackSize / 2,
266 kHaystackSize - kHaystackSize / 2));
268 state.SetBytesProcessed(kHaystackSize64 *
state.iterations());
276 state.SetBytesProcessed(kHaystackSize64 *
state.iterations());
284 state.SetBytesProcessed(kHaystackSize64 *
state.iterations());
291 kHaystack + kHaystackSize / 2,
292 kHaystackSize - kHaystackSize / 2));
294 state.SetBytesProcessed(kHaystackSize64 *
state.iterations());
301 kHaystack + kHaystackSize - 10, 10, kHaystack + kHaystackSize - 1, 1));
309 std::search(kHaystack + kHaystackSize - 10, kHaystack + kHaystackSize,
310 kHaystack + kHaystackSize - 1, kHaystack + kHaystackSize));
318 kHaystack + kHaystackSize - 10, 10, kHaystack + kHaystackSize - 1, 1));