xref: /aosp_15_r20/external/regex-re2/re2/testing/regexp_benchmark.cc (revision ccdc9c3e24c519bfa4832a66aa2e83a52c19f295)
1*ccdc9c3eSSadaf Ebrahimi // Copyright 2006-2008 The RE2 Authors.  All Rights Reserved.
2*ccdc9c3eSSadaf Ebrahimi // Use of this source code is governed by a BSD-style
3*ccdc9c3eSSadaf Ebrahimi // license that can be found in the LICENSE file.
4*ccdc9c3eSSadaf Ebrahimi 
5*ccdc9c3eSSadaf Ebrahimi // Benchmarks for regular expression implementations.
6*ccdc9c3eSSadaf Ebrahimi 
7*ccdc9c3eSSadaf Ebrahimi #include <stdint.h>
8*ccdc9c3eSSadaf Ebrahimi #include <stdio.h>
9*ccdc9c3eSSadaf Ebrahimi #include <stdlib.h>
10*ccdc9c3eSSadaf Ebrahimi #include <string>
11*ccdc9c3eSSadaf Ebrahimi #include <utility>
12*ccdc9c3eSSadaf Ebrahimi 
13*ccdc9c3eSSadaf Ebrahimi #include "util/test.h"
14*ccdc9c3eSSadaf Ebrahimi #include "util/logging.h"
15*ccdc9c3eSSadaf Ebrahimi #include "util/strutil.h"
16*ccdc9c3eSSadaf Ebrahimi #include "re2/prog.h"
17*ccdc9c3eSSadaf Ebrahimi #include "re2/re2.h"
18*ccdc9c3eSSadaf Ebrahimi #include "re2/regexp.h"
19*ccdc9c3eSSadaf Ebrahimi #include "util/pcre.h"
20*ccdc9c3eSSadaf Ebrahimi #include "util/benchmark.h"
21*ccdc9c3eSSadaf Ebrahimi 
22*ccdc9c3eSSadaf Ebrahimi namespace re2 {
23*ccdc9c3eSSadaf Ebrahimi void Test();
24*ccdc9c3eSSadaf Ebrahimi void MemoryUsage();
25*ccdc9c3eSSadaf Ebrahimi }  // namespace re2
26*ccdc9c3eSSadaf Ebrahimi 
27*ccdc9c3eSSadaf Ebrahimi typedef testing::MallocCounter MallocCounter;
28*ccdc9c3eSSadaf Ebrahimi 
29*ccdc9c3eSSadaf Ebrahimi namespace re2 {
30*ccdc9c3eSSadaf Ebrahimi 
Test()31*ccdc9c3eSSadaf Ebrahimi void Test() {
32*ccdc9c3eSSadaf Ebrahimi   Regexp* re = Regexp::Parse("(\\d+)-(\\d+)-(\\d+)", Regexp::LikePerl, NULL);
33*ccdc9c3eSSadaf Ebrahimi   CHECK(re);
34*ccdc9c3eSSadaf Ebrahimi   Prog* prog = re->CompileToProg(0);
35*ccdc9c3eSSadaf Ebrahimi   CHECK(prog);
36*ccdc9c3eSSadaf Ebrahimi   CHECK(prog->IsOnePass());
37*ccdc9c3eSSadaf Ebrahimi   const char* text = "650-253-0001";
38*ccdc9c3eSSadaf Ebrahimi   StringPiece sp[4];
39*ccdc9c3eSSadaf Ebrahimi   CHECK(prog->SearchOnePass(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 4));
40*ccdc9c3eSSadaf Ebrahimi   CHECK_EQ(sp[0], "650-253-0001");
41*ccdc9c3eSSadaf Ebrahimi   CHECK_EQ(sp[1], "650");
42*ccdc9c3eSSadaf Ebrahimi   CHECK_EQ(sp[2], "253");
43*ccdc9c3eSSadaf Ebrahimi   CHECK_EQ(sp[3], "0001");
44*ccdc9c3eSSadaf Ebrahimi   delete prog;
45*ccdc9c3eSSadaf Ebrahimi   re->Decref();
46*ccdc9c3eSSadaf Ebrahimi   LOG(INFO) << "test passed\n";
47*ccdc9c3eSSadaf Ebrahimi }
48*ccdc9c3eSSadaf Ebrahimi 
MemoryUsage()49*ccdc9c3eSSadaf Ebrahimi void MemoryUsage() {
50*ccdc9c3eSSadaf Ebrahimi   const char* regexp = "(\\d+)-(\\d+)-(\\d+)";
51*ccdc9c3eSSadaf Ebrahimi   const char* text = "650-253-0001";
52*ccdc9c3eSSadaf Ebrahimi   {
53*ccdc9c3eSSadaf Ebrahimi     MallocCounter mc(MallocCounter::THIS_THREAD_ONLY);
54*ccdc9c3eSSadaf Ebrahimi     Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL);
55*ccdc9c3eSSadaf Ebrahimi     CHECK(re);
56*ccdc9c3eSSadaf Ebrahimi     // Can't pass mc.HeapGrowth() and mc.PeakHeapGrowth() to LOG(INFO) directly,
57*ccdc9c3eSSadaf Ebrahimi     // because LOG(INFO) might do a big allocation before they get evaluated.
58*ccdc9c3eSSadaf Ebrahimi     fprintf(stderr, "Regexp: %7lld bytes (peak=%lld)\n", mc.HeapGrowth(), mc.PeakHeapGrowth());
59*ccdc9c3eSSadaf Ebrahimi     mc.Reset();
60*ccdc9c3eSSadaf Ebrahimi 
61*ccdc9c3eSSadaf Ebrahimi     Prog* prog = re->CompileToProg(0);
62*ccdc9c3eSSadaf Ebrahimi     CHECK(prog);
63*ccdc9c3eSSadaf Ebrahimi     CHECK(prog->IsOnePass());
64*ccdc9c3eSSadaf Ebrahimi     fprintf(stderr, "Prog:   %7lld bytes (peak=%lld)\n", mc.HeapGrowth(), mc.PeakHeapGrowth());
65*ccdc9c3eSSadaf Ebrahimi     mc.Reset();
66*ccdc9c3eSSadaf Ebrahimi 
67*ccdc9c3eSSadaf Ebrahimi     StringPiece sp[4];
68*ccdc9c3eSSadaf Ebrahimi     CHECK(prog->SearchOnePass(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 4));
69*ccdc9c3eSSadaf Ebrahimi     fprintf(stderr, "Search: %7lld bytes (peak=%lld)\n", mc.HeapGrowth(), mc.PeakHeapGrowth());
70*ccdc9c3eSSadaf Ebrahimi     delete prog;
71*ccdc9c3eSSadaf Ebrahimi     re->Decref();
72*ccdc9c3eSSadaf Ebrahimi   }
73*ccdc9c3eSSadaf Ebrahimi 
74*ccdc9c3eSSadaf Ebrahimi   {
75*ccdc9c3eSSadaf Ebrahimi     MallocCounter mc(MallocCounter::THIS_THREAD_ONLY);
76*ccdc9c3eSSadaf Ebrahimi 
77*ccdc9c3eSSadaf Ebrahimi     PCRE re(regexp, PCRE::UTF8);
78*ccdc9c3eSSadaf Ebrahimi     fprintf(stderr, "RE:     %7lld bytes (peak=%lld)\n", mc.HeapGrowth(), mc.PeakHeapGrowth());
79*ccdc9c3eSSadaf Ebrahimi     PCRE::FullMatch(text, re);
80*ccdc9c3eSSadaf Ebrahimi     fprintf(stderr, "RE:     %7lld bytes (peak=%lld)\n", mc.HeapGrowth(), mc.PeakHeapGrowth());
81*ccdc9c3eSSadaf Ebrahimi   }
82*ccdc9c3eSSadaf Ebrahimi 
83*ccdc9c3eSSadaf Ebrahimi   {
84*ccdc9c3eSSadaf Ebrahimi     MallocCounter mc(MallocCounter::THIS_THREAD_ONLY);
85*ccdc9c3eSSadaf Ebrahimi 
86*ccdc9c3eSSadaf Ebrahimi     PCRE* re = new PCRE(regexp, PCRE::UTF8);
87*ccdc9c3eSSadaf Ebrahimi     fprintf(stderr, "PCRE*:  %7lld bytes (peak=%lld)\n", mc.HeapGrowth(), mc.PeakHeapGrowth());
88*ccdc9c3eSSadaf Ebrahimi     PCRE::FullMatch(text, *re);
89*ccdc9c3eSSadaf Ebrahimi     fprintf(stderr, "PCRE*:  %7lld bytes (peak=%lld)\n", mc.HeapGrowth(), mc.PeakHeapGrowth());
90*ccdc9c3eSSadaf Ebrahimi     delete re;
91*ccdc9c3eSSadaf Ebrahimi   }
92*ccdc9c3eSSadaf Ebrahimi 
93*ccdc9c3eSSadaf Ebrahimi   {
94*ccdc9c3eSSadaf Ebrahimi     MallocCounter mc(MallocCounter::THIS_THREAD_ONLY);
95*ccdc9c3eSSadaf Ebrahimi 
96*ccdc9c3eSSadaf Ebrahimi     RE2 re(regexp);
97*ccdc9c3eSSadaf Ebrahimi     fprintf(stderr, "RE2:    %7lld bytes (peak=%lld)\n", mc.HeapGrowth(), mc.PeakHeapGrowth());
98*ccdc9c3eSSadaf Ebrahimi     RE2::FullMatch(text, re);
99*ccdc9c3eSSadaf Ebrahimi     fprintf(stderr, "RE2:    %7lld bytes (peak=%lld)\n", mc.HeapGrowth(), mc.PeakHeapGrowth());
100*ccdc9c3eSSadaf Ebrahimi   }
101*ccdc9c3eSSadaf Ebrahimi 
102*ccdc9c3eSSadaf Ebrahimi   fprintf(stderr, "sizeof: PCRE=%zd RE2=%zd Prog=%zd Inst=%zd\n",
103*ccdc9c3eSSadaf Ebrahimi           sizeof(PCRE), sizeof(RE2), sizeof(Prog), sizeof(Prog::Inst));
104*ccdc9c3eSSadaf Ebrahimi }
105*ccdc9c3eSSadaf Ebrahimi 
106*ccdc9c3eSSadaf Ebrahimi // Regular expression implementation wrappers.
107*ccdc9c3eSSadaf Ebrahimi // Defined at bottom of file, but they are repetitive
108*ccdc9c3eSSadaf Ebrahimi // and not interesting.
109*ccdc9c3eSSadaf Ebrahimi 
110*ccdc9c3eSSadaf Ebrahimi typedef void SearchImpl(int iters, const char* regexp, const StringPiece& text,
111*ccdc9c3eSSadaf Ebrahimi              Prog::Anchor anchor, bool expect_match);
112*ccdc9c3eSSadaf Ebrahimi 
113*ccdc9c3eSSadaf Ebrahimi SearchImpl SearchDFA, SearchNFA, SearchOnePass, SearchBitState,
114*ccdc9c3eSSadaf Ebrahimi            SearchPCRE, SearchRE2,
115*ccdc9c3eSSadaf Ebrahimi            SearchCachedDFA, SearchCachedNFA, SearchCachedOnePass, SearchCachedBitState,
116*ccdc9c3eSSadaf Ebrahimi            SearchCachedPCRE, SearchCachedRE2;
117*ccdc9c3eSSadaf Ebrahimi 
118*ccdc9c3eSSadaf Ebrahimi typedef void ParseImpl(int iters, const char* regexp, const StringPiece& text);
119*ccdc9c3eSSadaf Ebrahimi 
120*ccdc9c3eSSadaf Ebrahimi ParseImpl Parse1NFA, Parse1OnePass, Parse1BitState,
121*ccdc9c3eSSadaf Ebrahimi           Parse1PCRE, Parse1RE2,
122*ccdc9c3eSSadaf Ebrahimi           Parse1Backtrack,
123*ccdc9c3eSSadaf Ebrahimi           Parse1CachedNFA, Parse1CachedOnePass, Parse1CachedBitState,
124*ccdc9c3eSSadaf Ebrahimi           Parse1CachedPCRE, Parse1CachedRE2,
125*ccdc9c3eSSadaf Ebrahimi           Parse1CachedBacktrack;
126*ccdc9c3eSSadaf Ebrahimi 
127*ccdc9c3eSSadaf Ebrahimi ParseImpl Parse3NFA, Parse3OnePass, Parse3BitState,
128*ccdc9c3eSSadaf Ebrahimi           Parse3PCRE, Parse3RE2,
129*ccdc9c3eSSadaf Ebrahimi           Parse3Backtrack,
130*ccdc9c3eSSadaf Ebrahimi           Parse3CachedNFA, Parse3CachedOnePass, Parse3CachedBitState,
131*ccdc9c3eSSadaf Ebrahimi           Parse3CachedPCRE, Parse3CachedRE2,
132*ccdc9c3eSSadaf Ebrahimi           Parse3CachedBacktrack;
133*ccdc9c3eSSadaf Ebrahimi 
134*ccdc9c3eSSadaf Ebrahimi ParseImpl SearchParse2CachedPCRE, SearchParse2CachedRE2;
135*ccdc9c3eSSadaf Ebrahimi 
136*ccdc9c3eSSadaf Ebrahimi ParseImpl SearchParse1CachedPCRE, SearchParse1CachedRE2;
137*ccdc9c3eSSadaf Ebrahimi 
138*ccdc9c3eSSadaf Ebrahimi // Benchmark: failed search for regexp in random text.
139*ccdc9c3eSSadaf Ebrahimi 
140*ccdc9c3eSSadaf Ebrahimi // Generate random text that won't contain the search string,
141*ccdc9c3eSSadaf Ebrahimi // to test worst-case search behavior.
MakeText(string * text,int nbytes)142*ccdc9c3eSSadaf Ebrahimi void MakeText(string* text, int nbytes) {
143*ccdc9c3eSSadaf Ebrahimi   srand(1);
144*ccdc9c3eSSadaf Ebrahimi   text->resize(nbytes);
145*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < nbytes; i++) {
146*ccdc9c3eSSadaf Ebrahimi     // Generate a one-byte rune that isn't a control character (e.g. '\n').
147*ccdc9c3eSSadaf Ebrahimi     // Clipping to 0x20 introduces some bias, but we don't need uniformity.
148*ccdc9c3eSSadaf Ebrahimi     int byte = rand() & 0x7F;
149*ccdc9c3eSSadaf Ebrahimi     if (byte < 0x20)
150*ccdc9c3eSSadaf Ebrahimi       byte = 0x20;
151*ccdc9c3eSSadaf Ebrahimi     (*text)[i] = byte;
152*ccdc9c3eSSadaf Ebrahimi   }
153*ccdc9c3eSSadaf Ebrahimi }
154*ccdc9c3eSSadaf Ebrahimi 
155*ccdc9c3eSSadaf Ebrahimi // Makes text of size nbytes, then calls run to search
156*ccdc9c3eSSadaf Ebrahimi // the text for regexp iters times.
Search(int iters,int nbytes,const char * regexp,SearchImpl * search)157*ccdc9c3eSSadaf Ebrahimi void Search(int iters, int nbytes, const char* regexp, SearchImpl* search) {
158*ccdc9c3eSSadaf Ebrahimi   StopBenchmarkTiming();
159*ccdc9c3eSSadaf Ebrahimi   string s;
160*ccdc9c3eSSadaf Ebrahimi   MakeText(&s, nbytes);
161*ccdc9c3eSSadaf Ebrahimi   BenchmarkMemoryUsage();
162*ccdc9c3eSSadaf Ebrahimi   StartBenchmarkTiming();
163*ccdc9c3eSSadaf Ebrahimi   search(iters, regexp, s, Prog::kUnanchored, false);
164*ccdc9c3eSSadaf Ebrahimi   SetBenchmarkBytesProcessed(static_cast<int64_t>(iters)*nbytes);
165*ccdc9c3eSSadaf Ebrahimi }
166*ccdc9c3eSSadaf Ebrahimi 
167*ccdc9c3eSSadaf Ebrahimi // These two are easy because they start with an A,
168*ccdc9c3eSSadaf Ebrahimi // giving the search loop something to memchr for.
169*ccdc9c3eSSadaf Ebrahimi #define EASY0      "ABCDEFGHIJKLMNOPQRSTUVWXYZ$"
170*ccdc9c3eSSadaf Ebrahimi #define EASY1      "A[AB]B[BC]C[CD]D[DE]E[EF]F[FG]G[GH]H[HI]I[IJ]J$"
171*ccdc9c3eSSadaf Ebrahimi 
172*ccdc9c3eSSadaf Ebrahimi // This is a little harder, since it starts with a character class
173*ccdc9c3eSSadaf Ebrahimi // and thus can't be memchr'ed.  Could look for ABC and work backward,
174*ccdc9c3eSSadaf Ebrahimi // but no one does that.
175*ccdc9c3eSSadaf Ebrahimi #define MEDIUM     "[XYZ]ABCDEFGHIJKLMNOPQRSTUVWXYZ$"
176*ccdc9c3eSSadaf Ebrahimi 
177*ccdc9c3eSSadaf Ebrahimi // This is a fair amount harder, because of the leading [ -~]*.
178*ccdc9c3eSSadaf Ebrahimi // A bad backtracking implementation will take O(text^2) time to
179*ccdc9c3eSSadaf Ebrahimi // figure out there's no match.
180*ccdc9c3eSSadaf Ebrahimi #define HARD       "[ -~]*ABCDEFGHIJKLMNOPQRSTUVWXYZ$"
181*ccdc9c3eSSadaf Ebrahimi 
182*ccdc9c3eSSadaf Ebrahimi // This has quite a high degree of fanout.
183*ccdc9c3eSSadaf Ebrahimi // NFA execution will be particularly slow.
184*ccdc9c3eSSadaf Ebrahimi #define FANOUT     "(?:[\\x{80}-\\x{10FFFF}]?){100}[\\x{80}-\\x{10FFFF}]"
185*ccdc9c3eSSadaf Ebrahimi 
186*ccdc9c3eSSadaf Ebrahimi // This stresses engines that are trying to track parentheses.
187*ccdc9c3eSSadaf Ebrahimi #define PARENS     "([ -~])*(A)(B)(C)(D)(E)(F)(G)(H)(I)(J)(K)(L)(M)" \
188*ccdc9c3eSSadaf Ebrahimi                    "(N)(O)(P)(Q)(R)(S)(T)(U)(V)(W)(X)(Y)(Z)$"
189*ccdc9c3eSSadaf Ebrahimi 
Search_Easy0_CachedDFA(int i,int n)190*ccdc9c3eSSadaf Ebrahimi void Search_Easy0_CachedDFA(int i, int n)     { Search(i, n, EASY0, SearchCachedDFA); }
Search_Easy0_CachedNFA(int i,int n)191*ccdc9c3eSSadaf Ebrahimi void Search_Easy0_CachedNFA(int i, int n)     { Search(i, n, EASY0, SearchCachedNFA); }
Search_Easy0_CachedPCRE(int i,int n)192*ccdc9c3eSSadaf Ebrahimi void Search_Easy0_CachedPCRE(int i, int n)    { Search(i, n, EASY0, SearchCachedPCRE); }
Search_Easy0_CachedRE2(int i,int n)193*ccdc9c3eSSadaf Ebrahimi void Search_Easy0_CachedRE2(int i, int n)     { Search(i, n, EASY0, SearchCachedRE2); }
194*ccdc9c3eSSadaf Ebrahimi 
195*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Easy0_CachedDFA,     8, 16<<20)->ThreadRange(1, NumCPUs());
196*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Easy0_CachedNFA,     8, 256<<10)->ThreadRange(1, NumCPUs());
197*ccdc9c3eSSadaf Ebrahimi #ifdef USEPCRE
198*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Easy0_CachedPCRE,    8, 16<<20)->ThreadRange(1, NumCPUs());
199*ccdc9c3eSSadaf Ebrahimi #endif
200*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Easy0_CachedRE2,     8, 16<<20)->ThreadRange(1, NumCPUs());
201*ccdc9c3eSSadaf Ebrahimi 
Search_Easy1_CachedDFA(int i,int n)202*ccdc9c3eSSadaf Ebrahimi void Search_Easy1_CachedDFA(int i, int n)     { Search(i, n, EASY1, SearchCachedDFA); }
Search_Easy1_CachedNFA(int i,int n)203*ccdc9c3eSSadaf Ebrahimi void Search_Easy1_CachedNFA(int i, int n)     { Search(i, n, EASY1, SearchCachedNFA); }
Search_Easy1_CachedPCRE(int i,int n)204*ccdc9c3eSSadaf Ebrahimi void Search_Easy1_CachedPCRE(int i, int n)    { Search(i, n, EASY1, SearchCachedPCRE); }
Search_Easy1_CachedRE2(int i,int n)205*ccdc9c3eSSadaf Ebrahimi void Search_Easy1_CachedRE2(int i, int n)     { Search(i, n, EASY1, SearchCachedRE2); }
206*ccdc9c3eSSadaf Ebrahimi 
207*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Easy1_CachedDFA,     8, 16<<20)->ThreadRange(1, NumCPUs());
208*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Easy1_CachedNFA,     8, 256<<10)->ThreadRange(1, NumCPUs());
209*ccdc9c3eSSadaf Ebrahimi #ifdef USEPCRE
210*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Easy1_CachedPCRE,    8, 16<<20)->ThreadRange(1, NumCPUs());
211*ccdc9c3eSSadaf Ebrahimi #endif
212*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Easy1_CachedRE2,     8, 16<<20)->ThreadRange(1, NumCPUs());
213*ccdc9c3eSSadaf Ebrahimi 
Search_Medium_CachedDFA(int i,int n)214*ccdc9c3eSSadaf Ebrahimi void Search_Medium_CachedDFA(int i, int n)     { Search(i, n, MEDIUM, SearchCachedDFA); }
Search_Medium_CachedNFA(int i,int n)215*ccdc9c3eSSadaf Ebrahimi void Search_Medium_CachedNFA(int i, int n)     { Search(i, n, MEDIUM, SearchCachedNFA); }
Search_Medium_CachedPCRE(int i,int n)216*ccdc9c3eSSadaf Ebrahimi void Search_Medium_CachedPCRE(int i, int n)    { Search(i, n, MEDIUM, SearchCachedPCRE); }
Search_Medium_CachedRE2(int i,int n)217*ccdc9c3eSSadaf Ebrahimi void Search_Medium_CachedRE2(int i, int n)     { Search(i, n, MEDIUM, SearchCachedRE2); }
218*ccdc9c3eSSadaf Ebrahimi 
219*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Medium_CachedDFA,     8, 16<<20)->ThreadRange(1, NumCPUs());
220*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Medium_CachedNFA,     8, 256<<10)->ThreadRange(1, NumCPUs());
221*ccdc9c3eSSadaf Ebrahimi #ifdef USEPCRE
222*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Medium_CachedPCRE,    8, 256<<10)->ThreadRange(1, NumCPUs());
223*ccdc9c3eSSadaf Ebrahimi #endif
224*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Medium_CachedRE2,     8, 16<<20)->ThreadRange(1, NumCPUs());
225*ccdc9c3eSSadaf Ebrahimi 
Search_Hard_CachedDFA(int i,int n)226*ccdc9c3eSSadaf Ebrahimi void Search_Hard_CachedDFA(int i, int n)     { Search(i, n, HARD, SearchCachedDFA); }
Search_Hard_CachedNFA(int i,int n)227*ccdc9c3eSSadaf Ebrahimi void Search_Hard_CachedNFA(int i, int n)     { Search(i, n, HARD, SearchCachedNFA); }
Search_Hard_CachedPCRE(int i,int n)228*ccdc9c3eSSadaf Ebrahimi void Search_Hard_CachedPCRE(int i, int n)    { Search(i, n, HARD, SearchCachedPCRE); }
Search_Hard_CachedRE2(int i,int n)229*ccdc9c3eSSadaf Ebrahimi void Search_Hard_CachedRE2(int i, int n)     { Search(i, n, HARD, SearchCachedRE2); }
230*ccdc9c3eSSadaf Ebrahimi 
231*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Hard_CachedDFA,     8, 16<<20)->ThreadRange(1, NumCPUs());
232*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Hard_CachedNFA,     8, 256<<10)->ThreadRange(1, NumCPUs());
233*ccdc9c3eSSadaf Ebrahimi #ifdef USEPCRE
234*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Hard_CachedPCRE,    8, 4<<10)->ThreadRange(1, NumCPUs());
235*ccdc9c3eSSadaf Ebrahimi #endif
236*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Hard_CachedRE2,     8, 16<<20)->ThreadRange(1, NumCPUs());
237*ccdc9c3eSSadaf Ebrahimi 
Search_Fanout_CachedDFA(int i,int n)238*ccdc9c3eSSadaf Ebrahimi void Search_Fanout_CachedDFA(int i, int n)     { Search(i, n, FANOUT, SearchCachedDFA); }
Search_Fanout_CachedNFA(int i,int n)239*ccdc9c3eSSadaf Ebrahimi void Search_Fanout_CachedNFA(int i, int n)     { Search(i, n, FANOUT, SearchCachedNFA); }
Search_Fanout_CachedPCRE(int i,int n)240*ccdc9c3eSSadaf Ebrahimi void Search_Fanout_CachedPCRE(int i, int n)    { Search(i, n, FANOUT, SearchCachedPCRE); }
Search_Fanout_CachedRE2(int i,int n)241*ccdc9c3eSSadaf Ebrahimi void Search_Fanout_CachedRE2(int i, int n)     { Search(i, n, FANOUT, SearchCachedRE2); }
242*ccdc9c3eSSadaf Ebrahimi 
243*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Fanout_CachedDFA,     8, 16<<20)->ThreadRange(1, NumCPUs());
244*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Fanout_CachedNFA,     8, 256<<10)->ThreadRange(1, NumCPUs());
245*ccdc9c3eSSadaf Ebrahimi #ifdef USEPCRE
246*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Fanout_CachedPCRE,    8, 4<<10)->ThreadRange(1, NumCPUs());
247*ccdc9c3eSSadaf Ebrahimi #endif
248*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Fanout_CachedRE2,     8, 16<<20)->ThreadRange(1, NumCPUs());
249*ccdc9c3eSSadaf Ebrahimi 
Search_Parens_CachedDFA(int i,int n)250*ccdc9c3eSSadaf Ebrahimi void Search_Parens_CachedDFA(int i, int n)     { Search(i, n, PARENS, SearchCachedDFA); }
Search_Parens_CachedNFA(int i,int n)251*ccdc9c3eSSadaf Ebrahimi void Search_Parens_CachedNFA(int i, int n)     { Search(i, n, PARENS, SearchCachedNFA); }
Search_Parens_CachedPCRE(int i,int n)252*ccdc9c3eSSadaf Ebrahimi void Search_Parens_CachedPCRE(int i, int n)    { Search(i, n, PARENS, SearchCachedPCRE); }
Search_Parens_CachedRE2(int i,int n)253*ccdc9c3eSSadaf Ebrahimi void Search_Parens_CachedRE2(int i, int n)     { Search(i, n, PARENS, SearchCachedRE2); }
254*ccdc9c3eSSadaf Ebrahimi 
255*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Parens_CachedDFA,     8, 16<<20)->ThreadRange(1, NumCPUs());
256*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Parens_CachedNFA,     8, 256<<10)->ThreadRange(1, NumCPUs());
257*ccdc9c3eSSadaf Ebrahimi #ifdef USEPCRE
258*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Parens_CachedPCRE,    8, 8)->ThreadRange(1, NumCPUs());
259*ccdc9c3eSSadaf Ebrahimi #endif
260*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Parens_CachedRE2,     8, 16<<20)->ThreadRange(1, NumCPUs());
261*ccdc9c3eSSadaf Ebrahimi 
SearchBigFixed(int iters,int nbytes,SearchImpl * search)262*ccdc9c3eSSadaf Ebrahimi void SearchBigFixed(int iters, int nbytes, SearchImpl* search) {
263*ccdc9c3eSSadaf Ebrahimi   StopBenchmarkTiming();
264*ccdc9c3eSSadaf Ebrahimi   string s;
265*ccdc9c3eSSadaf Ebrahimi   s.append(nbytes/2, 'x');
266*ccdc9c3eSSadaf Ebrahimi   string regexp = "^" + s + ".*$";
267*ccdc9c3eSSadaf Ebrahimi   string t;
268*ccdc9c3eSSadaf Ebrahimi   MakeText(&t, nbytes/2);
269*ccdc9c3eSSadaf Ebrahimi   s += t;
270*ccdc9c3eSSadaf Ebrahimi   BenchmarkMemoryUsage();
271*ccdc9c3eSSadaf Ebrahimi   StartBenchmarkTiming();
272*ccdc9c3eSSadaf Ebrahimi   search(iters, regexp.c_str(), s, Prog::kUnanchored, true);
273*ccdc9c3eSSadaf Ebrahimi   SetBenchmarkBytesProcessed(static_cast<int64_t>(iters)*nbytes);
274*ccdc9c3eSSadaf Ebrahimi }
275*ccdc9c3eSSadaf Ebrahimi 
Search_BigFixed_CachedDFA(int i,int n)276*ccdc9c3eSSadaf Ebrahimi void Search_BigFixed_CachedDFA(int i, int n)     { SearchBigFixed(i, n, SearchCachedDFA); }
Search_BigFixed_CachedNFA(int i,int n)277*ccdc9c3eSSadaf Ebrahimi void Search_BigFixed_CachedNFA(int i, int n)     { SearchBigFixed(i, n, SearchCachedNFA); }
Search_BigFixed_CachedPCRE(int i,int n)278*ccdc9c3eSSadaf Ebrahimi void Search_BigFixed_CachedPCRE(int i, int n)    { SearchBigFixed(i, n, SearchCachedPCRE); }
Search_BigFixed_CachedRE2(int i,int n)279*ccdc9c3eSSadaf Ebrahimi void Search_BigFixed_CachedRE2(int i, int n)     { SearchBigFixed(i, n, SearchCachedRE2); }
280*ccdc9c3eSSadaf Ebrahimi 
281*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_BigFixed_CachedDFA,     8, 1<<20)->ThreadRange(1, NumCPUs());
282*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_BigFixed_CachedNFA,     8, 32<<10)->ThreadRange(1, NumCPUs());
283*ccdc9c3eSSadaf Ebrahimi #ifdef USEPCRE
284*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_BigFixed_CachedPCRE,    8, 32<<10)->ThreadRange(1, NumCPUs());
285*ccdc9c3eSSadaf Ebrahimi #endif
286*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_BigFixed_CachedRE2,     8, 1<<20)->ThreadRange(1, NumCPUs());
287*ccdc9c3eSSadaf Ebrahimi 
288*ccdc9c3eSSadaf Ebrahimi // Benchmark: FindAndConsume
289*ccdc9c3eSSadaf Ebrahimi 
FindAndConsume(int iters,int nbytes)290*ccdc9c3eSSadaf Ebrahimi void FindAndConsume(int iters, int nbytes) {
291*ccdc9c3eSSadaf Ebrahimi   StopBenchmarkTiming();
292*ccdc9c3eSSadaf Ebrahimi   string s;
293*ccdc9c3eSSadaf Ebrahimi   MakeText(&s, nbytes);
294*ccdc9c3eSSadaf Ebrahimi   s.append("Hello World");
295*ccdc9c3eSSadaf Ebrahimi   StartBenchmarkTiming();
296*ccdc9c3eSSadaf Ebrahimi   RE2 re("((Hello World))");
297*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
298*ccdc9c3eSSadaf Ebrahimi     StringPiece t = s;
299*ccdc9c3eSSadaf Ebrahimi     StringPiece u;
300*ccdc9c3eSSadaf Ebrahimi     CHECK(RE2::FindAndConsume(&t, re, &u));
301*ccdc9c3eSSadaf Ebrahimi     CHECK_EQ(u, "Hello World");
302*ccdc9c3eSSadaf Ebrahimi   }
303*ccdc9c3eSSadaf Ebrahimi   SetBenchmarkBytesProcessed(static_cast<int64_t>(iters)*nbytes);
304*ccdc9c3eSSadaf Ebrahimi }
305*ccdc9c3eSSadaf Ebrahimi 
306*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(FindAndConsume, 8, 16<<20)->ThreadRange(1, NumCPUs());
307*ccdc9c3eSSadaf Ebrahimi 
308*ccdc9c3eSSadaf Ebrahimi // Benchmark: successful anchored search.
309*ccdc9c3eSSadaf Ebrahimi 
SearchSuccess(int iters,int nbytes,const char * regexp,SearchImpl * search)310*ccdc9c3eSSadaf Ebrahimi void SearchSuccess(int iters, int nbytes, const char* regexp, SearchImpl* search) {
311*ccdc9c3eSSadaf Ebrahimi   StopBenchmarkTiming();
312*ccdc9c3eSSadaf Ebrahimi   string s;
313*ccdc9c3eSSadaf Ebrahimi   MakeText(&s, nbytes);
314*ccdc9c3eSSadaf Ebrahimi   BenchmarkMemoryUsage();
315*ccdc9c3eSSadaf Ebrahimi   StartBenchmarkTiming();
316*ccdc9c3eSSadaf Ebrahimi   search(iters, regexp, s, Prog::kAnchored, true);
317*ccdc9c3eSSadaf Ebrahimi   SetBenchmarkBytesProcessed(static_cast<int64_t>(iters)*nbytes);
318*ccdc9c3eSSadaf Ebrahimi }
319*ccdc9c3eSSadaf Ebrahimi 
320*ccdc9c3eSSadaf Ebrahimi // Unambiguous search (RE2 can use OnePass).
321*ccdc9c3eSSadaf Ebrahimi 
Search_Success_DFA(int i,int n)322*ccdc9c3eSSadaf Ebrahimi void Search_Success_DFA(int i, int n)     { SearchSuccess(i, n, ".*$", SearchDFA); }
Search_Success_NFA(int i,int n)323*ccdc9c3eSSadaf Ebrahimi void Search_Success_NFA(int i, int n)     { SearchSuccess(i, n, ".*$", SearchNFA); }
Search_Success_PCRE(int i,int n)324*ccdc9c3eSSadaf Ebrahimi void Search_Success_PCRE(int i, int n)    { SearchSuccess(i, n, ".*$", SearchPCRE); }
Search_Success_RE2(int i,int n)325*ccdc9c3eSSadaf Ebrahimi void Search_Success_RE2(int i, int n)     { SearchSuccess(i, n, ".*$", SearchRE2); }
Search_Success_OnePass(int i,int n)326*ccdc9c3eSSadaf Ebrahimi void Search_Success_OnePass(int i, int n) { SearchSuccess(i, n, ".*$", SearchOnePass); }
327*ccdc9c3eSSadaf Ebrahimi 
328*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Success_DFA,     8, 16<<20)->ThreadRange(1, NumCPUs());
329*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Success_NFA,     8, 16<<20)->ThreadRange(1, NumCPUs());
330*ccdc9c3eSSadaf Ebrahimi #ifdef USEPCRE
331*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Success_PCRE,    8, 16<<20)->ThreadRange(1, NumCPUs());
332*ccdc9c3eSSadaf Ebrahimi #endif
333*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Success_RE2,     8, 16<<20)->ThreadRange(1, NumCPUs());
334*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Success_OnePass, 8, 2<<20)->ThreadRange(1, NumCPUs());
335*ccdc9c3eSSadaf Ebrahimi 
Search_Success_CachedDFA(int i,int n)336*ccdc9c3eSSadaf Ebrahimi void Search_Success_CachedDFA(int i, int n)     { SearchSuccess(i, n, ".*$", SearchCachedDFA); }
Search_Success_CachedNFA(int i,int n)337*ccdc9c3eSSadaf Ebrahimi void Search_Success_CachedNFA(int i, int n)     { SearchSuccess(i, n, ".*$", SearchCachedNFA); }
Search_Success_CachedPCRE(int i,int n)338*ccdc9c3eSSadaf Ebrahimi void Search_Success_CachedPCRE(int i, int n)    { SearchSuccess(i, n, ".*$", SearchCachedPCRE); }
Search_Success_CachedRE2(int i,int n)339*ccdc9c3eSSadaf Ebrahimi void Search_Success_CachedRE2(int i, int n)     { SearchSuccess(i, n, ".*$", SearchCachedRE2); }
Search_Success_CachedOnePass(int i,int n)340*ccdc9c3eSSadaf Ebrahimi void Search_Success_CachedOnePass(int i, int n) { SearchSuccess(i, n, ".*$", SearchCachedOnePass); }
341*ccdc9c3eSSadaf Ebrahimi 
342*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Success_CachedDFA,     8, 16<<20)->ThreadRange(1, NumCPUs());
343*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Success_CachedNFA,     8, 16<<20)->ThreadRange(1, NumCPUs());
344*ccdc9c3eSSadaf Ebrahimi #ifdef USEPCRE
345*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Success_CachedPCRE,    8, 16<<20)->ThreadRange(1, NumCPUs());
346*ccdc9c3eSSadaf Ebrahimi #endif
347*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Success_CachedRE2,     8, 16<<20)->ThreadRange(1, NumCPUs());
348*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Success_CachedOnePass, 8, 2<<20)->ThreadRange(1, NumCPUs());
349*ccdc9c3eSSadaf Ebrahimi 
350*ccdc9c3eSSadaf Ebrahimi // Ambiguous search (RE2 cannot use OnePass).
351*ccdc9c3eSSadaf Ebrahimi // Used to be ".*.$", but that is coalesced to ".+$" these days.
352*ccdc9c3eSSadaf Ebrahimi 
Search_Success1_DFA(int i,int n)353*ccdc9c3eSSadaf Ebrahimi void Search_Success1_DFA(int i, int n)      { SearchSuccess(i, n, ".*\\C$", SearchDFA); }
Search_Success1_NFA(int i,int n)354*ccdc9c3eSSadaf Ebrahimi void Search_Success1_NFA(int i, int n)      { SearchSuccess(i, n, ".*\\C$", SearchNFA); }
Search_Success1_PCRE(int i,int n)355*ccdc9c3eSSadaf Ebrahimi void Search_Success1_PCRE(int i, int n)     { SearchSuccess(i, n, ".*\\C$", SearchPCRE); }
Search_Success1_RE2(int i,int n)356*ccdc9c3eSSadaf Ebrahimi void Search_Success1_RE2(int i, int n)      { SearchSuccess(i, n, ".*\\C$", SearchRE2); }
Search_Success1_BitState(int i,int n)357*ccdc9c3eSSadaf Ebrahimi void Search_Success1_BitState(int i, int n) { SearchSuccess(i, n, ".*\\C$", SearchBitState); }
358*ccdc9c3eSSadaf Ebrahimi 
359*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Success1_DFA,      8, 16<<20)->ThreadRange(1, NumCPUs());
360*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Success1_NFA,      8, 16<<20)->ThreadRange(1, NumCPUs());
361*ccdc9c3eSSadaf Ebrahimi #ifdef USEPCRE
362*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Success1_PCRE,     8, 16<<20)->ThreadRange(1, NumCPUs());
363*ccdc9c3eSSadaf Ebrahimi #endif
364*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Success1_RE2,      8, 16<<20)->ThreadRange(1, NumCPUs());
365*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Success1_BitState, 8, 2<<20)->ThreadRange(1, NumCPUs());
366*ccdc9c3eSSadaf Ebrahimi 
Search_Success1_CachedDFA(int i,int n)367*ccdc9c3eSSadaf Ebrahimi void Search_Success1_CachedDFA(int i, int n)      { SearchSuccess(i, n, ".*\\C$", SearchCachedDFA); }
Search_Success1_CachedNFA(int i,int n)368*ccdc9c3eSSadaf Ebrahimi void Search_Success1_CachedNFA(int i, int n)      { SearchSuccess(i, n, ".*\\C$", SearchCachedNFA); }
Search_Success1_CachedPCRE(int i,int n)369*ccdc9c3eSSadaf Ebrahimi void Search_Success1_CachedPCRE(int i, int n)     { SearchSuccess(i, n, ".*\\C$", SearchCachedPCRE); }
Search_Success1_CachedRE2(int i,int n)370*ccdc9c3eSSadaf Ebrahimi void Search_Success1_CachedRE2(int i, int n)      { SearchSuccess(i, n, ".*\\C$", SearchCachedRE2); }
Search_Success1_CachedBitState(int i,int n)371*ccdc9c3eSSadaf Ebrahimi void Search_Success1_CachedBitState(int i, int n) { SearchSuccess(i, n, ".*\\C$", SearchCachedBitState); }
372*ccdc9c3eSSadaf Ebrahimi 
373*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Success1_CachedDFA,      8, 16<<20)->ThreadRange(1, NumCPUs());
374*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Success1_CachedNFA,      8, 16<<20)->ThreadRange(1, NumCPUs());
375*ccdc9c3eSSadaf Ebrahimi #ifdef USEPCRE
376*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Success1_CachedPCRE,     8, 16<<20)->ThreadRange(1, NumCPUs());
377*ccdc9c3eSSadaf Ebrahimi #endif
378*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Success1_CachedRE2,      8, 16<<20)->ThreadRange(1, NumCPUs());
379*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_Success1_CachedBitState, 8, 2<<20)->ThreadRange(1, NumCPUs());
380*ccdc9c3eSSadaf Ebrahimi 
381*ccdc9c3eSSadaf Ebrahimi // Benchmark: AltMatch optimisation (just to verify that it works)
382*ccdc9c3eSSadaf Ebrahimi // Note that OnePass doesn't implement it!
383*ccdc9c3eSSadaf Ebrahimi 
SearchAltMatch(int iters,int nbytes,SearchImpl * search)384*ccdc9c3eSSadaf Ebrahimi void SearchAltMatch(int iters, int nbytes, SearchImpl* search) {
385*ccdc9c3eSSadaf Ebrahimi   StopBenchmarkTiming();
386*ccdc9c3eSSadaf Ebrahimi   string s;
387*ccdc9c3eSSadaf Ebrahimi   MakeText(&s, nbytes);
388*ccdc9c3eSSadaf Ebrahimi   BenchmarkMemoryUsage();
389*ccdc9c3eSSadaf Ebrahimi   StartBenchmarkTiming();
390*ccdc9c3eSSadaf Ebrahimi   search(iters, "\\C*", s, Prog::kAnchored, true);
391*ccdc9c3eSSadaf Ebrahimi   SetBenchmarkBytesProcessed(static_cast<int64_t>(iters)*nbytes);
392*ccdc9c3eSSadaf Ebrahimi }
393*ccdc9c3eSSadaf Ebrahimi 
Search_AltMatch_DFA(int i,int n)394*ccdc9c3eSSadaf Ebrahimi void Search_AltMatch_DFA(int i, int n)      { SearchAltMatch(i, n, SearchDFA); }
Search_AltMatch_NFA(int i,int n)395*ccdc9c3eSSadaf Ebrahimi void Search_AltMatch_NFA(int i, int n)      { SearchAltMatch(i, n, SearchNFA); }
Search_AltMatch_OnePass(int i,int n)396*ccdc9c3eSSadaf Ebrahimi void Search_AltMatch_OnePass(int i, int n)  { SearchAltMatch(i, n, SearchOnePass); }
Search_AltMatch_BitState(int i,int n)397*ccdc9c3eSSadaf Ebrahimi void Search_AltMatch_BitState(int i, int n) { SearchAltMatch(i, n, SearchBitState); }
Search_AltMatch_PCRE(int i,int n)398*ccdc9c3eSSadaf Ebrahimi void Search_AltMatch_PCRE(int i, int n)     { SearchAltMatch(i, n, SearchPCRE); }
Search_AltMatch_RE2(int i,int n)399*ccdc9c3eSSadaf Ebrahimi void Search_AltMatch_RE2(int i, int n)      { SearchAltMatch(i, n, SearchRE2); }
400*ccdc9c3eSSadaf Ebrahimi 
401*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_AltMatch_DFA,      8, 16<<20)->ThreadRange(1, NumCPUs());
402*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_AltMatch_NFA,      8, 16<<20)->ThreadRange(1, NumCPUs());
403*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_AltMatch_OnePass,  8, 16<<20)->ThreadRange(1, NumCPUs());
404*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_AltMatch_BitState, 8, 16<<20)->ThreadRange(1, NumCPUs());
405*ccdc9c3eSSadaf Ebrahimi #ifdef USEPCRE
406*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_AltMatch_PCRE,     8, 16<<20)->ThreadRange(1, NumCPUs());
407*ccdc9c3eSSadaf Ebrahimi #endif
408*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_AltMatch_RE2,      8, 16<<20)->ThreadRange(1, NumCPUs());
409*ccdc9c3eSSadaf Ebrahimi 
Search_AltMatch_CachedDFA(int i,int n)410*ccdc9c3eSSadaf Ebrahimi void Search_AltMatch_CachedDFA(int i, int n)      { SearchAltMatch(i, n, SearchCachedDFA); }
Search_AltMatch_CachedNFA(int i,int n)411*ccdc9c3eSSadaf Ebrahimi void Search_AltMatch_CachedNFA(int i, int n)      { SearchAltMatch(i, n, SearchCachedNFA); }
Search_AltMatch_CachedOnePass(int i,int n)412*ccdc9c3eSSadaf Ebrahimi void Search_AltMatch_CachedOnePass(int i, int n)  { SearchAltMatch(i, n, SearchCachedOnePass); }
Search_AltMatch_CachedBitState(int i,int n)413*ccdc9c3eSSadaf Ebrahimi void Search_AltMatch_CachedBitState(int i, int n) { SearchAltMatch(i, n, SearchCachedBitState); }
Search_AltMatch_CachedPCRE(int i,int n)414*ccdc9c3eSSadaf Ebrahimi void Search_AltMatch_CachedPCRE(int i, int n)     { SearchAltMatch(i, n, SearchCachedPCRE); }
Search_AltMatch_CachedRE2(int i,int n)415*ccdc9c3eSSadaf Ebrahimi void Search_AltMatch_CachedRE2(int i, int n)      { SearchAltMatch(i, n, SearchCachedRE2); }
416*ccdc9c3eSSadaf Ebrahimi 
417*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_AltMatch_CachedDFA,      8, 16<<20)->ThreadRange(1, NumCPUs());
418*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_AltMatch_CachedNFA,      8, 16<<20)->ThreadRange(1, NumCPUs());
419*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_AltMatch_CachedOnePass,  8, 16<<20)->ThreadRange(1, NumCPUs());
420*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_AltMatch_CachedBitState, 8, 16<<20)->ThreadRange(1, NumCPUs());
421*ccdc9c3eSSadaf Ebrahimi #ifdef USEPCRE
422*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_AltMatch_CachedPCRE,     8, 16<<20)->ThreadRange(1, NumCPUs());
423*ccdc9c3eSSadaf Ebrahimi #endif
424*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(Search_AltMatch_CachedRE2,      8, 16<<20)->ThreadRange(1, NumCPUs());
425*ccdc9c3eSSadaf Ebrahimi 
426*ccdc9c3eSSadaf Ebrahimi // Benchmark: use regexp to find phone number.
427*ccdc9c3eSSadaf Ebrahimi 
SearchDigits(int iters,SearchImpl * search)428*ccdc9c3eSSadaf Ebrahimi void SearchDigits(int iters, SearchImpl* search) {
429*ccdc9c3eSSadaf Ebrahimi   StringPiece s("650-253-0001");
430*ccdc9c3eSSadaf Ebrahimi   BenchmarkMemoryUsage();
431*ccdc9c3eSSadaf Ebrahimi   search(iters, "([0-9]+)-([0-9]+)-([0-9]+)", s, Prog::kAnchored, true);
432*ccdc9c3eSSadaf Ebrahimi   SetBenchmarkItemsProcessed(iters);
433*ccdc9c3eSSadaf Ebrahimi }
434*ccdc9c3eSSadaf Ebrahimi 
Search_Digits_DFA(int i)435*ccdc9c3eSSadaf Ebrahimi void Search_Digits_DFA(int i)         { SearchDigits(i, SearchDFA); }
Search_Digits_NFA(int i)436*ccdc9c3eSSadaf Ebrahimi void Search_Digits_NFA(int i)         { SearchDigits(i, SearchNFA); }
Search_Digits_OnePass(int i)437*ccdc9c3eSSadaf Ebrahimi void Search_Digits_OnePass(int i)     { SearchDigits(i, SearchOnePass); }
Search_Digits_PCRE(int i)438*ccdc9c3eSSadaf Ebrahimi void Search_Digits_PCRE(int i)        { SearchDigits(i, SearchPCRE); }
Search_Digits_RE2(int i)439*ccdc9c3eSSadaf Ebrahimi void Search_Digits_RE2(int i)         { SearchDigits(i, SearchRE2); }
Search_Digits_BitState(int i)440*ccdc9c3eSSadaf Ebrahimi void Search_Digits_BitState(int i)         { SearchDigits(i, SearchBitState); }
441*ccdc9c3eSSadaf Ebrahimi 
442*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Search_Digits_DFA)->ThreadRange(1, NumCPUs());
443*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Search_Digits_NFA)->ThreadRange(1, NumCPUs());
444*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Search_Digits_OnePass)->ThreadRange(1, NumCPUs());
445*ccdc9c3eSSadaf Ebrahimi #ifdef USEPCRE
446*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Search_Digits_PCRE)->ThreadRange(1, NumCPUs());
447*ccdc9c3eSSadaf Ebrahimi #endif
448*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Search_Digits_RE2)->ThreadRange(1, NumCPUs());
449*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Search_Digits_BitState)->ThreadRange(1, NumCPUs());
450*ccdc9c3eSSadaf Ebrahimi 
451*ccdc9c3eSSadaf Ebrahimi // Benchmark: use regexp to parse digit fields in phone number.
452*ccdc9c3eSSadaf Ebrahimi 
Parse3Digits(int iters,void (* parse3)(int,const char *,const StringPiece &))453*ccdc9c3eSSadaf Ebrahimi void Parse3Digits(int iters,
454*ccdc9c3eSSadaf Ebrahimi                void (*parse3)(int, const char*, const StringPiece&)) {
455*ccdc9c3eSSadaf Ebrahimi   BenchmarkMemoryUsage();
456*ccdc9c3eSSadaf Ebrahimi   parse3(iters, "([0-9]+)-([0-9]+)-([0-9]+)", "650-253-0001");
457*ccdc9c3eSSadaf Ebrahimi   SetBenchmarkItemsProcessed(iters);
458*ccdc9c3eSSadaf Ebrahimi }
459*ccdc9c3eSSadaf Ebrahimi 
Parse_Digits_NFA(int i)460*ccdc9c3eSSadaf Ebrahimi void Parse_Digits_NFA(int i)         { Parse3Digits(i, Parse3NFA); }
Parse_Digits_OnePass(int i)461*ccdc9c3eSSadaf Ebrahimi void Parse_Digits_OnePass(int i)     { Parse3Digits(i, Parse3OnePass); }
Parse_Digits_PCRE(int i)462*ccdc9c3eSSadaf Ebrahimi void Parse_Digits_PCRE(int i)        { Parse3Digits(i, Parse3PCRE); }
Parse_Digits_RE2(int i)463*ccdc9c3eSSadaf Ebrahimi void Parse_Digits_RE2(int i)         { Parse3Digits(i, Parse3RE2); }
Parse_Digits_Backtrack(int i)464*ccdc9c3eSSadaf Ebrahimi void Parse_Digits_Backtrack(int i)   { Parse3Digits(i, Parse3Backtrack); }
Parse_Digits_BitState(int i)465*ccdc9c3eSSadaf Ebrahimi void Parse_Digits_BitState(int i)   { Parse3Digits(i, Parse3BitState); }
466*ccdc9c3eSSadaf Ebrahimi 
467*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_Digits_NFA)->ThreadRange(1, NumCPUs());
468*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_Digits_OnePass)->ThreadRange(1, NumCPUs());
469*ccdc9c3eSSadaf Ebrahimi #ifdef USEPCRE
470*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_Digits_PCRE)->ThreadRange(1, NumCPUs());
471*ccdc9c3eSSadaf Ebrahimi #endif
472*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_Digits_RE2)->ThreadRange(1, NumCPUs());
473*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_Digits_Backtrack)->ThreadRange(1, NumCPUs());
474*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_Digits_BitState)->ThreadRange(1, NumCPUs());
475*ccdc9c3eSSadaf Ebrahimi 
Parse_CachedDigits_NFA(int i)476*ccdc9c3eSSadaf Ebrahimi void Parse_CachedDigits_NFA(int i)         { Parse3Digits(i, Parse3CachedNFA); }
Parse_CachedDigits_OnePass(int i)477*ccdc9c3eSSadaf Ebrahimi void Parse_CachedDigits_OnePass(int i)     { Parse3Digits(i, Parse3CachedOnePass); }
Parse_CachedDigits_PCRE(int i)478*ccdc9c3eSSadaf Ebrahimi void Parse_CachedDigits_PCRE(int i)        { Parse3Digits(i, Parse3CachedPCRE); }
Parse_CachedDigits_RE2(int i)479*ccdc9c3eSSadaf Ebrahimi void Parse_CachedDigits_RE2(int i)         { Parse3Digits(i, Parse3CachedRE2); }
Parse_CachedDigits_Backtrack(int i)480*ccdc9c3eSSadaf Ebrahimi void Parse_CachedDigits_Backtrack(int i)   { Parse3Digits(i, Parse3CachedBacktrack); }
Parse_CachedDigits_BitState(int i)481*ccdc9c3eSSadaf Ebrahimi void Parse_CachedDigits_BitState(int i)   { Parse3Digits(i, Parse3CachedBitState); }
482*ccdc9c3eSSadaf Ebrahimi 
483*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_CachedDigits_NFA)->ThreadRange(1, NumCPUs());
484*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_CachedDigits_OnePass)->ThreadRange(1, NumCPUs());
485*ccdc9c3eSSadaf Ebrahimi #ifdef USEPCRE
486*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_CachedDigits_PCRE)->ThreadRange(1, NumCPUs());
487*ccdc9c3eSSadaf Ebrahimi #endif
488*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_CachedDigits_Backtrack)->ThreadRange(1, NumCPUs());
489*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_CachedDigits_RE2)->ThreadRange(1, NumCPUs());
490*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_CachedDigits_BitState)->ThreadRange(1, NumCPUs());
491*ccdc9c3eSSadaf Ebrahimi 
Parse3DigitDs(int iters,void (* parse3)(int,const char *,const StringPiece &))492*ccdc9c3eSSadaf Ebrahimi void Parse3DigitDs(int iters,
493*ccdc9c3eSSadaf Ebrahimi                void (*parse3)(int, const char*, const StringPiece&)) {
494*ccdc9c3eSSadaf Ebrahimi   BenchmarkMemoryUsage();
495*ccdc9c3eSSadaf Ebrahimi   parse3(iters, "(\\d+)-(\\d+)-(\\d+)", "650-253-0001");
496*ccdc9c3eSSadaf Ebrahimi   SetBenchmarkItemsProcessed(iters);
497*ccdc9c3eSSadaf Ebrahimi }
498*ccdc9c3eSSadaf Ebrahimi 
Parse_DigitDs_NFA(int i)499*ccdc9c3eSSadaf Ebrahimi void Parse_DigitDs_NFA(int i)         { Parse3DigitDs(i, Parse3NFA); }
Parse_DigitDs_OnePass(int i)500*ccdc9c3eSSadaf Ebrahimi void Parse_DigitDs_OnePass(int i)     { Parse3DigitDs(i, Parse3OnePass); }
Parse_DigitDs_PCRE(int i)501*ccdc9c3eSSadaf Ebrahimi void Parse_DigitDs_PCRE(int i)        { Parse3DigitDs(i, Parse3PCRE); }
Parse_DigitDs_RE2(int i)502*ccdc9c3eSSadaf Ebrahimi void Parse_DigitDs_RE2(int i)         { Parse3DigitDs(i, Parse3RE2); }
Parse_DigitDs_Backtrack(int i)503*ccdc9c3eSSadaf Ebrahimi void Parse_DigitDs_Backtrack(int i)   { Parse3DigitDs(i, Parse3CachedBacktrack); }
Parse_DigitDs_BitState(int i)504*ccdc9c3eSSadaf Ebrahimi void Parse_DigitDs_BitState(int i)   { Parse3DigitDs(i, Parse3CachedBitState); }
505*ccdc9c3eSSadaf Ebrahimi 
506*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_DigitDs_NFA)->ThreadRange(1, NumCPUs());
507*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_DigitDs_OnePass)->ThreadRange(1, NumCPUs());
508*ccdc9c3eSSadaf Ebrahimi #ifdef USEPCRE
509*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_DigitDs_PCRE)->ThreadRange(1, NumCPUs());
510*ccdc9c3eSSadaf Ebrahimi #endif
511*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_DigitDs_RE2)->ThreadRange(1, NumCPUs());
512*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_DigitDs_Backtrack)->ThreadRange(1, NumCPUs());
513*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_DigitDs_BitState)->ThreadRange(1, NumCPUs());
514*ccdc9c3eSSadaf Ebrahimi 
Parse_CachedDigitDs_NFA(int i)515*ccdc9c3eSSadaf Ebrahimi void Parse_CachedDigitDs_NFA(int i)         { Parse3DigitDs(i, Parse3CachedNFA); }
Parse_CachedDigitDs_OnePass(int i)516*ccdc9c3eSSadaf Ebrahimi void Parse_CachedDigitDs_OnePass(int i)     { Parse3DigitDs(i, Parse3CachedOnePass); }
Parse_CachedDigitDs_PCRE(int i)517*ccdc9c3eSSadaf Ebrahimi void Parse_CachedDigitDs_PCRE(int i)        { Parse3DigitDs(i, Parse3CachedPCRE); }
Parse_CachedDigitDs_RE2(int i)518*ccdc9c3eSSadaf Ebrahimi void Parse_CachedDigitDs_RE2(int i)         { Parse3DigitDs(i, Parse3CachedRE2); }
Parse_CachedDigitDs_Backtrack(int i)519*ccdc9c3eSSadaf Ebrahimi void Parse_CachedDigitDs_Backtrack(int i)   { Parse3DigitDs(i, Parse3CachedBacktrack); }
Parse_CachedDigitDs_BitState(int i)520*ccdc9c3eSSadaf Ebrahimi void Parse_CachedDigitDs_BitState(int i)   { Parse3DigitDs(i, Parse3CachedBitState); }
521*ccdc9c3eSSadaf Ebrahimi 
522*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_CachedDigitDs_NFA)->ThreadRange(1, NumCPUs());
523*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_CachedDigitDs_OnePass)->ThreadRange(1, NumCPUs());
524*ccdc9c3eSSadaf Ebrahimi #ifdef USEPCRE
525*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_CachedDigitDs_PCRE)->ThreadRange(1, NumCPUs());
526*ccdc9c3eSSadaf Ebrahimi #endif
527*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_CachedDigitDs_Backtrack)->ThreadRange(1, NumCPUs());
528*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_CachedDigitDs_RE2)->ThreadRange(1, NumCPUs());
529*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_CachedDigitDs_BitState)->ThreadRange(1, NumCPUs());
530*ccdc9c3eSSadaf Ebrahimi 
531*ccdc9c3eSSadaf Ebrahimi // Benchmark: splitting off leading number field.
532*ccdc9c3eSSadaf Ebrahimi 
Parse1Split(int iters,void (* parse1)(int,const char *,const StringPiece &))533*ccdc9c3eSSadaf Ebrahimi void Parse1Split(int iters,
534*ccdc9c3eSSadaf Ebrahimi               void (*parse1)(int, const char*, const StringPiece&)) {
535*ccdc9c3eSSadaf Ebrahimi   BenchmarkMemoryUsage();
536*ccdc9c3eSSadaf Ebrahimi   parse1(iters, "[0-9]+-(.*)", "650-253-0001");
537*ccdc9c3eSSadaf Ebrahimi   SetBenchmarkItemsProcessed(iters);
538*ccdc9c3eSSadaf Ebrahimi }
539*ccdc9c3eSSadaf Ebrahimi 
Parse_Split_NFA(int i)540*ccdc9c3eSSadaf Ebrahimi void Parse_Split_NFA(int i)         { Parse1Split(i, Parse1NFA); }
Parse_Split_OnePass(int i)541*ccdc9c3eSSadaf Ebrahimi void Parse_Split_OnePass(int i)     { Parse1Split(i, Parse1OnePass); }
Parse_Split_PCRE(int i)542*ccdc9c3eSSadaf Ebrahimi void Parse_Split_PCRE(int i)        { Parse1Split(i, Parse1PCRE); }
Parse_Split_RE2(int i)543*ccdc9c3eSSadaf Ebrahimi void Parse_Split_RE2(int i)         { Parse1Split(i, Parse1RE2); }
Parse_Split_BitState(int i)544*ccdc9c3eSSadaf Ebrahimi void Parse_Split_BitState(int i)         { Parse1Split(i, Parse1BitState); }
545*ccdc9c3eSSadaf Ebrahimi 
546*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_Split_NFA)->ThreadRange(1, NumCPUs());
547*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_Split_OnePass)->ThreadRange(1, NumCPUs());
548*ccdc9c3eSSadaf Ebrahimi #ifdef USEPCRE
549*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_Split_PCRE)->ThreadRange(1, NumCPUs());
550*ccdc9c3eSSadaf Ebrahimi #endif
551*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_Split_RE2)->ThreadRange(1, NumCPUs());
552*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_Split_BitState)->ThreadRange(1, NumCPUs());
553*ccdc9c3eSSadaf Ebrahimi 
Parse_CachedSplit_NFA(int i)554*ccdc9c3eSSadaf Ebrahimi void Parse_CachedSplit_NFA(int i)         { Parse1Split(i, Parse1CachedNFA); }
Parse_CachedSplit_OnePass(int i)555*ccdc9c3eSSadaf Ebrahimi void Parse_CachedSplit_OnePass(int i)     { Parse1Split(i, Parse1CachedOnePass); }
Parse_CachedSplit_PCRE(int i)556*ccdc9c3eSSadaf Ebrahimi void Parse_CachedSplit_PCRE(int i)        { Parse1Split(i, Parse1CachedPCRE); }
Parse_CachedSplit_RE2(int i)557*ccdc9c3eSSadaf Ebrahimi void Parse_CachedSplit_RE2(int i)         { Parse1Split(i, Parse1CachedRE2); }
Parse_CachedSplit_BitState(int i)558*ccdc9c3eSSadaf Ebrahimi void Parse_CachedSplit_BitState(int i)         { Parse1Split(i, Parse1CachedBitState); }
559*ccdc9c3eSSadaf Ebrahimi 
560*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_CachedSplit_NFA)->ThreadRange(1, NumCPUs());
561*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_CachedSplit_OnePass)->ThreadRange(1, NumCPUs());
562*ccdc9c3eSSadaf Ebrahimi #ifdef USEPCRE
563*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_CachedSplit_PCRE)->ThreadRange(1, NumCPUs());
564*ccdc9c3eSSadaf Ebrahimi #endif
565*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_CachedSplit_RE2)->ThreadRange(1, NumCPUs());
566*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_CachedSplit_BitState)->ThreadRange(1, NumCPUs());
567*ccdc9c3eSSadaf Ebrahimi 
568*ccdc9c3eSSadaf Ebrahimi // Benchmark: splitting off leading number field but harder (ambiguous regexp).
569*ccdc9c3eSSadaf Ebrahimi 
Parse1SplitHard(int iters,void (* run)(int,const char *,const StringPiece &))570*ccdc9c3eSSadaf Ebrahimi void Parse1SplitHard(int iters,
571*ccdc9c3eSSadaf Ebrahimi                   void (*run)(int, const char*, const StringPiece&)) {
572*ccdc9c3eSSadaf Ebrahimi   BenchmarkMemoryUsage();
573*ccdc9c3eSSadaf Ebrahimi   run(iters, "[0-9]+.(.*)", "650-253-0001");
574*ccdc9c3eSSadaf Ebrahimi   SetBenchmarkItemsProcessed(iters);
575*ccdc9c3eSSadaf Ebrahimi }
576*ccdc9c3eSSadaf Ebrahimi 
Parse_SplitHard_NFA(int i)577*ccdc9c3eSSadaf Ebrahimi void Parse_SplitHard_NFA(int i)         { Parse1SplitHard(i, Parse1NFA); }
Parse_SplitHard_PCRE(int i)578*ccdc9c3eSSadaf Ebrahimi void Parse_SplitHard_PCRE(int i)        { Parse1SplitHard(i, Parse1PCRE); }
Parse_SplitHard_RE2(int i)579*ccdc9c3eSSadaf Ebrahimi void Parse_SplitHard_RE2(int i)         { Parse1SplitHard(i, Parse1RE2); }
Parse_SplitHard_BitState(int i)580*ccdc9c3eSSadaf Ebrahimi void Parse_SplitHard_BitState(int i)         { Parse1SplitHard(i, Parse1BitState); }
581*ccdc9c3eSSadaf Ebrahimi 
582*ccdc9c3eSSadaf Ebrahimi #ifdef USEPCRE
583*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_SplitHard_PCRE)->ThreadRange(1, NumCPUs());
584*ccdc9c3eSSadaf Ebrahimi #endif
585*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_SplitHard_RE2)->ThreadRange(1, NumCPUs());
586*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_SplitHard_BitState)->ThreadRange(1, NumCPUs());
587*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_SplitHard_NFA)->ThreadRange(1, NumCPUs());
588*ccdc9c3eSSadaf Ebrahimi 
Parse_CachedSplitHard_NFA(int i)589*ccdc9c3eSSadaf Ebrahimi void Parse_CachedSplitHard_NFA(int i)       { Parse1SplitHard(i, Parse1CachedNFA); }
Parse_CachedSplitHard_PCRE(int i)590*ccdc9c3eSSadaf Ebrahimi void Parse_CachedSplitHard_PCRE(int i)      { Parse1SplitHard(i, Parse1CachedPCRE); }
Parse_CachedSplitHard_RE2(int i)591*ccdc9c3eSSadaf Ebrahimi void Parse_CachedSplitHard_RE2(int i)       { Parse1SplitHard(i, Parse1CachedRE2); }
Parse_CachedSplitHard_BitState(int i)592*ccdc9c3eSSadaf Ebrahimi void Parse_CachedSplitHard_BitState(int i)       { Parse1SplitHard(i, Parse1CachedBitState); }
Parse_CachedSplitHard_Backtrack(int i)593*ccdc9c3eSSadaf Ebrahimi void Parse_CachedSplitHard_Backtrack(int i)       { Parse1SplitHard(i, Parse1CachedBacktrack); }
594*ccdc9c3eSSadaf Ebrahimi 
595*ccdc9c3eSSadaf Ebrahimi #ifdef USEPCRE
596*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_CachedSplitHard_PCRE)->ThreadRange(1, NumCPUs());
597*ccdc9c3eSSadaf Ebrahimi #endif
598*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_CachedSplitHard_RE2)->ThreadRange(1, NumCPUs());
599*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_CachedSplitHard_BitState)->ThreadRange(1, NumCPUs());
600*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_CachedSplitHard_NFA)->ThreadRange(1, NumCPUs());
601*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_CachedSplitHard_Backtrack)->ThreadRange(1, NumCPUs());
602*ccdc9c3eSSadaf Ebrahimi 
603*ccdc9c3eSSadaf Ebrahimi // Benchmark: Parse1SplitHard, big text, small match.
604*ccdc9c3eSSadaf Ebrahimi 
Parse1SplitBig1(int iters,void (* run)(int,const char *,const StringPiece &))605*ccdc9c3eSSadaf Ebrahimi void Parse1SplitBig1(int iters,
606*ccdc9c3eSSadaf Ebrahimi                   void (*run)(int, const char*, const StringPiece&)) {
607*ccdc9c3eSSadaf Ebrahimi   string s;
608*ccdc9c3eSSadaf Ebrahimi   s.append(100000, 'x');
609*ccdc9c3eSSadaf Ebrahimi   s.append("650-253-0001");
610*ccdc9c3eSSadaf Ebrahimi   BenchmarkMemoryUsage();
611*ccdc9c3eSSadaf Ebrahimi   run(iters, "[0-9]+.(.*)", s);
612*ccdc9c3eSSadaf Ebrahimi   SetBenchmarkItemsProcessed(iters);
613*ccdc9c3eSSadaf Ebrahimi }
614*ccdc9c3eSSadaf Ebrahimi 
Parse_CachedSplitBig1_PCRE(int i)615*ccdc9c3eSSadaf Ebrahimi void Parse_CachedSplitBig1_PCRE(int i)      { Parse1SplitBig1(i, SearchParse1CachedPCRE); }
Parse_CachedSplitBig1_RE2(int i)616*ccdc9c3eSSadaf Ebrahimi void Parse_CachedSplitBig1_RE2(int i)       { Parse1SplitBig1(i, SearchParse1CachedRE2); }
617*ccdc9c3eSSadaf Ebrahimi 
618*ccdc9c3eSSadaf Ebrahimi #ifdef USEPCRE
619*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_CachedSplitBig1_PCRE)->ThreadRange(1, NumCPUs());
620*ccdc9c3eSSadaf Ebrahimi #endif
621*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_CachedSplitBig1_RE2)->ThreadRange(1, NumCPUs());
622*ccdc9c3eSSadaf Ebrahimi 
623*ccdc9c3eSSadaf Ebrahimi // Benchmark: Parse1SplitHard, big text, big match.
624*ccdc9c3eSSadaf Ebrahimi 
Parse1SplitBig2(int iters,void (* run)(int,const char *,const StringPiece &))625*ccdc9c3eSSadaf Ebrahimi void Parse1SplitBig2(int iters,
626*ccdc9c3eSSadaf Ebrahimi                   void (*run)(int, const char*, const StringPiece&)) {
627*ccdc9c3eSSadaf Ebrahimi   string s;
628*ccdc9c3eSSadaf Ebrahimi   s.append("650-253-");
629*ccdc9c3eSSadaf Ebrahimi   s.append(100000, '0');
630*ccdc9c3eSSadaf Ebrahimi   BenchmarkMemoryUsage();
631*ccdc9c3eSSadaf Ebrahimi   run(iters, "[0-9]+.(.*)", s);
632*ccdc9c3eSSadaf Ebrahimi   SetBenchmarkItemsProcessed(iters);
633*ccdc9c3eSSadaf Ebrahimi }
634*ccdc9c3eSSadaf Ebrahimi 
Parse_CachedSplitBig2_PCRE(int i)635*ccdc9c3eSSadaf Ebrahimi void Parse_CachedSplitBig2_PCRE(int i)      { Parse1SplitBig2(i, SearchParse1CachedPCRE); }
Parse_CachedSplitBig2_RE2(int i)636*ccdc9c3eSSadaf Ebrahimi void Parse_CachedSplitBig2_RE2(int i)       { Parse1SplitBig2(i, SearchParse1CachedRE2); }
637*ccdc9c3eSSadaf Ebrahimi 
638*ccdc9c3eSSadaf Ebrahimi #ifdef USEPCRE
639*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_CachedSplitBig2_PCRE)->ThreadRange(1, NumCPUs());
640*ccdc9c3eSSadaf Ebrahimi #endif
641*ccdc9c3eSSadaf Ebrahimi BENCHMARK(Parse_CachedSplitBig2_RE2)->ThreadRange(1, NumCPUs());
642*ccdc9c3eSSadaf Ebrahimi 
643*ccdc9c3eSSadaf Ebrahimi // Benchmark: measure time required to parse (but not execute)
644*ccdc9c3eSSadaf Ebrahimi // a simple regular expression.
645*ccdc9c3eSSadaf Ebrahimi 
ParseRegexp(int iters,const string & regexp)646*ccdc9c3eSSadaf Ebrahimi void ParseRegexp(int iters, const string& regexp) {
647*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
648*ccdc9c3eSSadaf Ebrahimi     Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL);
649*ccdc9c3eSSadaf Ebrahimi     CHECK(re);
650*ccdc9c3eSSadaf Ebrahimi     re->Decref();
651*ccdc9c3eSSadaf Ebrahimi   }
652*ccdc9c3eSSadaf Ebrahimi }
653*ccdc9c3eSSadaf Ebrahimi 
SimplifyRegexp(int iters,const string & regexp)654*ccdc9c3eSSadaf Ebrahimi void SimplifyRegexp(int iters, const string& regexp) {
655*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
656*ccdc9c3eSSadaf Ebrahimi     Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL);
657*ccdc9c3eSSadaf Ebrahimi     CHECK(re);
658*ccdc9c3eSSadaf Ebrahimi     Regexp* sre = re->Simplify();
659*ccdc9c3eSSadaf Ebrahimi     CHECK(sre);
660*ccdc9c3eSSadaf Ebrahimi     sre->Decref();
661*ccdc9c3eSSadaf Ebrahimi     re->Decref();
662*ccdc9c3eSSadaf Ebrahimi   }
663*ccdc9c3eSSadaf Ebrahimi }
664*ccdc9c3eSSadaf Ebrahimi 
NullWalkRegexp(int iters,const string & regexp)665*ccdc9c3eSSadaf Ebrahimi void NullWalkRegexp(int iters, const string& regexp) {
666*ccdc9c3eSSadaf Ebrahimi   Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL);
667*ccdc9c3eSSadaf Ebrahimi   CHECK(re);
668*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
669*ccdc9c3eSSadaf Ebrahimi     re->NullWalk();
670*ccdc9c3eSSadaf Ebrahimi   }
671*ccdc9c3eSSadaf Ebrahimi   re->Decref();
672*ccdc9c3eSSadaf Ebrahimi }
673*ccdc9c3eSSadaf Ebrahimi 
SimplifyCompileRegexp(int iters,const string & regexp)674*ccdc9c3eSSadaf Ebrahimi void SimplifyCompileRegexp(int iters, const string& regexp) {
675*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
676*ccdc9c3eSSadaf Ebrahimi     Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL);
677*ccdc9c3eSSadaf Ebrahimi     CHECK(re);
678*ccdc9c3eSSadaf Ebrahimi     Regexp* sre = re->Simplify();
679*ccdc9c3eSSadaf Ebrahimi     CHECK(sre);
680*ccdc9c3eSSadaf Ebrahimi     Prog* prog = sre->CompileToProg(0);
681*ccdc9c3eSSadaf Ebrahimi     CHECK(prog);
682*ccdc9c3eSSadaf Ebrahimi     delete prog;
683*ccdc9c3eSSadaf Ebrahimi     sre->Decref();
684*ccdc9c3eSSadaf Ebrahimi     re->Decref();
685*ccdc9c3eSSadaf Ebrahimi   }
686*ccdc9c3eSSadaf Ebrahimi }
687*ccdc9c3eSSadaf Ebrahimi 
CompileRegexp(int iters,const string & regexp)688*ccdc9c3eSSadaf Ebrahimi void CompileRegexp(int iters, const string& regexp) {
689*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
690*ccdc9c3eSSadaf Ebrahimi     Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL);
691*ccdc9c3eSSadaf Ebrahimi     CHECK(re);
692*ccdc9c3eSSadaf Ebrahimi     Prog* prog = re->CompileToProg(0);
693*ccdc9c3eSSadaf Ebrahimi     CHECK(prog);
694*ccdc9c3eSSadaf Ebrahimi     delete prog;
695*ccdc9c3eSSadaf Ebrahimi     re->Decref();
696*ccdc9c3eSSadaf Ebrahimi   }
697*ccdc9c3eSSadaf Ebrahimi }
698*ccdc9c3eSSadaf Ebrahimi 
CompileToProg(int iters,const string & regexp)699*ccdc9c3eSSadaf Ebrahimi void CompileToProg(int iters, const string& regexp) {
700*ccdc9c3eSSadaf Ebrahimi   Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL);
701*ccdc9c3eSSadaf Ebrahimi   CHECK(re);
702*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
703*ccdc9c3eSSadaf Ebrahimi     Prog* prog = re->CompileToProg(0);
704*ccdc9c3eSSadaf Ebrahimi     CHECK(prog);
705*ccdc9c3eSSadaf Ebrahimi     delete prog;
706*ccdc9c3eSSadaf Ebrahimi   }
707*ccdc9c3eSSadaf Ebrahimi   re->Decref();
708*ccdc9c3eSSadaf Ebrahimi }
709*ccdc9c3eSSadaf Ebrahimi 
CompileByteMap(int iters,const string & regexp)710*ccdc9c3eSSadaf Ebrahimi void CompileByteMap(int iters, const string& regexp) {
711*ccdc9c3eSSadaf Ebrahimi   Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL);
712*ccdc9c3eSSadaf Ebrahimi   CHECK(re);
713*ccdc9c3eSSadaf Ebrahimi   Prog* prog = re->CompileToProg(0);
714*ccdc9c3eSSadaf Ebrahimi   CHECK(prog);
715*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
716*ccdc9c3eSSadaf Ebrahimi     prog->ComputeByteMap();
717*ccdc9c3eSSadaf Ebrahimi   }
718*ccdc9c3eSSadaf Ebrahimi   delete prog;
719*ccdc9c3eSSadaf Ebrahimi   re->Decref();
720*ccdc9c3eSSadaf Ebrahimi }
721*ccdc9c3eSSadaf Ebrahimi 
CompilePCRE(int iters,const string & regexp)722*ccdc9c3eSSadaf Ebrahimi void CompilePCRE(int iters, const string& regexp) {
723*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
724*ccdc9c3eSSadaf Ebrahimi     PCRE re(regexp, PCRE::UTF8);
725*ccdc9c3eSSadaf Ebrahimi     CHECK_EQ(re.error(), "");
726*ccdc9c3eSSadaf Ebrahimi   }
727*ccdc9c3eSSadaf Ebrahimi }
728*ccdc9c3eSSadaf Ebrahimi 
CompileRE2(int iters,const string & regexp)729*ccdc9c3eSSadaf Ebrahimi void CompileRE2(int iters, const string& regexp) {
730*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
731*ccdc9c3eSSadaf Ebrahimi     RE2 re(regexp);
732*ccdc9c3eSSadaf Ebrahimi     CHECK_EQ(re.error(), "");
733*ccdc9c3eSSadaf Ebrahimi   }
734*ccdc9c3eSSadaf Ebrahimi }
735*ccdc9c3eSSadaf Ebrahimi 
RunBuild(int iters,const string & regexp,void (* run)(int,const string &))736*ccdc9c3eSSadaf Ebrahimi void RunBuild(int iters, const string& regexp, void (*run)(int, const string&)) {
737*ccdc9c3eSSadaf Ebrahimi   run(iters, regexp);
738*ccdc9c3eSSadaf Ebrahimi   SetBenchmarkItemsProcessed(iters);
739*ccdc9c3eSSadaf Ebrahimi }
740*ccdc9c3eSSadaf Ebrahimi 
741*ccdc9c3eSSadaf Ebrahimi }  // namespace re2
742*ccdc9c3eSSadaf Ebrahimi 
743*ccdc9c3eSSadaf Ebrahimi DEFINE_string(compile_regexp, "(.*)-(\\d+)-of-(\\d+)", "regexp for compile benchmarks");
744*ccdc9c3eSSadaf Ebrahimi 
745*ccdc9c3eSSadaf Ebrahimi namespace re2 {
746*ccdc9c3eSSadaf Ebrahimi 
BM_PCRE_Compile(int i)747*ccdc9c3eSSadaf Ebrahimi void BM_PCRE_Compile(int i)      { RunBuild(i, FLAGS_compile_regexp, CompilePCRE); }
BM_Regexp_Parse(int i)748*ccdc9c3eSSadaf Ebrahimi void BM_Regexp_Parse(int i)      { RunBuild(i, FLAGS_compile_regexp, ParseRegexp); }
BM_Regexp_Simplify(int i)749*ccdc9c3eSSadaf Ebrahimi void BM_Regexp_Simplify(int i)   { RunBuild(i, FLAGS_compile_regexp, SimplifyRegexp); }
BM_CompileToProg(int i)750*ccdc9c3eSSadaf Ebrahimi void BM_CompileToProg(int i)     { RunBuild(i, FLAGS_compile_regexp, CompileToProg); }
BM_CompileByteMap(int i)751*ccdc9c3eSSadaf Ebrahimi void BM_CompileByteMap(int i)     { RunBuild(i, FLAGS_compile_regexp, CompileByteMap); }
BM_Regexp_Compile(int i)752*ccdc9c3eSSadaf Ebrahimi void BM_Regexp_Compile(int i)    { RunBuild(i, FLAGS_compile_regexp, CompileRegexp); }
BM_Regexp_SimplifyCompile(int i)753*ccdc9c3eSSadaf Ebrahimi void BM_Regexp_SimplifyCompile(int i)   { RunBuild(i, FLAGS_compile_regexp, SimplifyCompileRegexp); }
BM_Regexp_NullWalk(int i)754*ccdc9c3eSSadaf Ebrahimi void BM_Regexp_NullWalk(int i)   { RunBuild(i, FLAGS_compile_regexp, NullWalkRegexp); }
BM_RE2_Compile(int i)755*ccdc9c3eSSadaf Ebrahimi void BM_RE2_Compile(int i)       { RunBuild(i, FLAGS_compile_regexp, CompileRE2); }
756*ccdc9c3eSSadaf Ebrahimi 
757*ccdc9c3eSSadaf Ebrahimi #ifdef USEPCRE
758*ccdc9c3eSSadaf Ebrahimi BENCHMARK(BM_PCRE_Compile)->ThreadRange(1, NumCPUs());
759*ccdc9c3eSSadaf Ebrahimi #endif
760*ccdc9c3eSSadaf Ebrahimi BENCHMARK(BM_Regexp_Parse)->ThreadRange(1, NumCPUs());
761*ccdc9c3eSSadaf Ebrahimi BENCHMARK(BM_Regexp_Simplify)->ThreadRange(1, NumCPUs());
762*ccdc9c3eSSadaf Ebrahimi BENCHMARK(BM_CompileToProg)->ThreadRange(1, NumCPUs());
763*ccdc9c3eSSadaf Ebrahimi BENCHMARK(BM_CompileByteMap)->ThreadRange(1, NumCPUs());
764*ccdc9c3eSSadaf Ebrahimi BENCHMARK(BM_Regexp_Compile)->ThreadRange(1, NumCPUs());
765*ccdc9c3eSSadaf Ebrahimi BENCHMARK(BM_Regexp_SimplifyCompile)->ThreadRange(1, NumCPUs());
766*ccdc9c3eSSadaf Ebrahimi BENCHMARK(BM_Regexp_NullWalk)->ThreadRange(1, NumCPUs());
767*ccdc9c3eSSadaf Ebrahimi BENCHMARK(BM_RE2_Compile)->ThreadRange(1, NumCPUs());
768*ccdc9c3eSSadaf Ebrahimi 
769*ccdc9c3eSSadaf Ebrahimi // Makes text of size nbytes, then calls run to search
770*ccdc9c3eSSadaf Ebrahimi // the text for regexp iters times.
SearchPhone(int iters,int nbytes,ParseImpl * search)771*ccdc9c3eSSadaf Ebrahimi void SearchPhone(int iters, int nbytes, ParseImpl* search) {
772*ccdc9c3eSSadaf Ebrahimi   StopBenchmarkTiming();
773*ccdc9c3eSSadaf Ebrahimi   string s;
774*ccdc9c3eSSadaf Ebrahimi   MakeText(&s, nbytes);
775*ccdc9c3eSSadaf Ebrahimi   s.append("(650) 253-0001");
776*ccdc9c3eSSadaf Ebrahimi   BenchmarkMemoryUsage();
777*ccdc9c3eSSadaf Ebrahimi   StartBenchmarkTiming();
778*ccdc9c3eSSadaf Ebrahimi   search(iters, "(\\d{3}-|\\(\\d{3}\\)\\s+)(\\d{3}-\\d{4})", s);
779*ccdc9c3eSSadaf Ebrahimi   SetBenchmarkBytesProcessed(static_cast<int64_t>(iters)*nbytes);
780*ccdc9c3eSSadaf Ebrahimi }
781*ccdc9c3eSSadaf Ebrahimi 
SearchPhone_CachedPCRE(int i,int n)782*ccdc9c3eSSadaf Ebrahimi void SearchPhone_CachedPCRE(int i, int n) {
783*ccdc9c3eSSadaf Ebrahimi   SearchPhone(i, n, SearchParse2CachedPCRE);
784*ccdc9c3eSSadaf Ebrahimi }
SearchPhone_CachedRE2(int i,int n)785*ccdc9c3eSSadaf Ebrahimi void SearchPhone_CachedRE2(int i, int n) {
786*ccdc9c3eSSadaf Ebrahimi   SearchPhone(i, n, SearchParse2CachedRE2);
787*ccdc9c3eSSadaf Ebrahimi }
788*ccdc9c3eSSadaf Ebrahimi 
789*ccdc9c3eSSadaf Ebrahimi #ifdef USEPCRE
790*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(SearchPhone_CachedPCRE, 8, 16<<20)->ThreadRange(1, NumCPUs());
791*ccdc9c3eSSadaf Ebrahimi #endif
792*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(SearchPhone_CachedRE2, 8, 16<<20)->ThreadRange(1, NumCPUs());
793*ccdc9c3eSSadaf Ebrahimi 
794*ccdc9c3eSSadaf Ebrahimi /*
795*ccdc9c3eSSadaf Ebrahimi TODO(rsc): Make this work again.
796*ccdc9c3eSSadaf Ebrahimi 
797*ccdc9c3eSSadaf Ebrahimi // Generates and returns a string over binary alphabet {0,1} that contains
798*ccdc9c3eSSadaf Ebrahimi // all possible binary sequences of length n as subsequences.  The obvious
799*ccdc9c3eSSadaf Ebrahimi // brute force method would generate a string of length n * 2^n, but this
800*ccdc9c3eSSadaf Ebrahimi // generates a string of length n + 2^n - 1 called a De Bruijn cycle.
801*ccdc9c3eSSadaf Ebrahimi // See Knuth, The Art of Computer Programming, Vol 2, Exercise 3.2.2 #17.
802*ccdc9c3eSSadaf Ebrahimi static string DeBruijnString(int n) {
803*ccdc9c3eSSadaf Ebrahimi   CHECK_LT(n, 8*sizeof(int));
804*ccdc9c3eSSadaf Ebrahimi   CHECK_GT(n, 0);
805*ccdc9c3eSSadaf Ebrahimi 
806*ccdc9c3eSSadaf Ebrahimi   std::vector<bool> did(1<<n);
807*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < 1<<n; i++)
808*ccdc9c3eSSadaf Ebrahimi     did[i] = false;
809*ccdc9c3eSSadaf Ebrahimi 
810*ccdc9c3eSSadaf Ebrahimi   string s;
811*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < n-1; i++)
812*ccdc9c3eSSadaf Ebrahimi     s.append("0");
813*ccdc9c3eSSadaf Ebrahimi   int bits = 0;
814*ccdc9c3eSSadaf Ebrahimi   int mask = (1<<n) - 1;
815*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < (1<<n); i++) {
816*ccdc9c3eSSadaf Ebrahimi     bits <<= 1;
817*ccdc9c3eSSadaf Ebrahimi     bits &= mask;
818*ccdc9c3eSSadaf Ebrahimi     if (!did[bits|1]) {
819*ccdc9c3eSSadaf Ebrahimi       bits |= 1;
820*ccdc9c3eSSadaf Ebrahimi       s.append("1");
821*ccdc9c3eSSadaf Ebrahimi     } else {
822*ccdc9c3eSSadaf Ebrahimi       s.append("0");
823*ccdc9c3eSSadaf Ebrahimi     }
824*ccdc9c3eSSadaf Ebrahimi     CHECK(!did[bits]);
825*ccdc9c3eSSadaf Ebrahimi     did[bits] = true;
826*ccdc9c3eSSadaf Ebrahimi   }
827*ccdc9c3eSSadaf Ebrahimi   return s;
828*ccdc9c3eSSadaf Ebrahimi }
829*ccdc9c3eSSadaf Ebrahimi 
830*ccdc9c3eSSadaf Ebrahimi void CacheFill(int iters, int n, SearchImpl *srch) {
831*ccdc9c3eSSadaf Ebrahimi   string s = DeBruijnString(n+1);
832*ccdc9c3eSSadaf Ebrahimi   string t;
833*ccdc9c3eSSadaf Ebrahimi   for (int i = n+1; i < 20; i++) {
834*ccdc9c3eSSadaf Ebrahimi     t = s + s;
835*ccdc9c3eSSadaf Ebrahimi     using std::swap;
836*ccdc9c3eSSadaf Ebrahimi     swap(s, t);
837*ccdc9c3eSSadaf Ebrahimi   }
838*ccdc9c3eSSadaf Ebrahimi   srch(iters, StringPrintf("0[01]{%d}$", n).c_str(), s,
839*ccdc9c3eSSadaf Ebrahimi        Prog::kUnanchored, true);
840*ccdc9c3eSSadaf Ebrahimi   SetBenchmarkBytesProcessed(static_cast<int64_t>(iters)*s.size());
841*ccdc9c3eSSadaf Ebrahimi }
842*ccdc9c3eSSadaf Ebrahimi 
843*ccdc9c3eSSadaf Ebrahimi void CacheFillPCRE(int i, int n) { CacheFill(i, n, SearchCachedPCRE); }
844*ccdc9c3eSSadaf Ebrahimi void CacheFillRE2(int i, int n)  { CacheFill(i, n, SearchCachedRE2); }
845*ccdc9c3eSSadaf Ebrahimi void CacheFillNFA(int i, int n)  { CacheFill(i, n, SearchCachedNFA); }
846*ccdc9c3eSSadaf Ebrahimi void CacheFillDFA(int i, int n)  { CacheFill(i, n, SearchCachedDFA); }
847*ccdc9c3eSSadaf Ebrahimi 
848*ccdc9c3eSSadaf Ebrahimi // BENCHMARK_WITH_ARG uses __LINE__ to generate distinct identifiers
849*ccdc9c3eSSadaf Ebrahimi // for the static BenchmarkRegisterer, which makes it unusable inside
850*ccdc9c3eSSadaf Ebrahimi // a macro like DO24 below.  MY_BENCHMARK_WITH_ARG uses the argument a
851*ccdc9c3eSSadaf Ebrahimi // to make the identifiers distinct (only possible when 'a' is a simple
852*ccdc9c3eSSadaf Ebrahimi // expression like 2, not like 1+1).
853*ccdc9c3eSSadaf Ebrahimi #define MY_BENCHMARK_WITH_ARG(n, a) \
854*ccdc9c3eSSadaf Ebrahimi   bool __benchmark_ ## n ## a =     \
855*ccdc9c3eSSadaf Ebrahimi     (new ::testing::Benchmark(#n, NewPermanentCallback(&n)))->ThreadRange(1, NumCPUs());
856*ccdc9c3eSSadaf Ebrahimi 
857*ccdc9c3eSSadaf Ebrahimi #define DO24(A, B) \
858*ccdc9c3eSSadaf Ebrahimi   A(B, 1);    A(B, 2);    A(B, 3);    A(B, 4);    A(B, 5);    A(B, 6);  \
859*ccdc9c3eSSadaf Ebrahimi   A(B, 7);    A(B, 8);    A(B, 9);    A(B, 10);   A(B, 11);   A(B, 12); \
860*ccdc9c3eSSadaf Ebrahimi   A(B, 13);   A(B, 14);   A(B, 15);   A(B, 16);   A(B, 17);   A(B, 18); \
861*ccdc9c3eSSadaf Ebrahimi   A(B, 19);   A(B, 20);   A(B, 21);   A(B, 22);   A(B, 23);   A(B, 24);
862*ccdc9c3eSSadaf Ebrahimi 
863*ccdc9c3eSSadaf Ebrahimi DO24(MY_BENCHMARK_WITH_ARG, CacheFillPCRE)
864*ccdc9c3eSSadaf Ebrahimi DO24(MY_BENCHMARK_WITH_ARG, CacheFillNFA)
865*ccdc9c3eSSadaf Ebrahimi DO24(MY_BENCHMARK_WITH_ARG, CacheFillRE2)
866*ccdc9c3eSSadaf Ebrahimi DO24(MY_BENCHMARK_WITH_ARG, CacheFillDFA)
867*ccdc9c3eSSadaf Ebrahimi 
868*ccdc9c3eSSadaf Ebrahimi #undef DO24
869*ccdc9c3eSSadaf Ebrahimi #undef MY_BENCHMARK_WITH_ARG
870*ccdc9c3eSSadaf Ebrahimi */
871*ccdc9c3eSSadaf Ebrahimi 
872*ccdc9c3eSSadaf Ebrahimi ////////////////////////////////////////////////////////////////////////
873*ccdc9c3eSSadaf Ebrahimi //
874*ccdc9c3eSSadaf Ebrahimi // Implementation routines.  Sad that there are so many,
875*ccdc9c3eSSadaf Ebrahimi // but all the interfaces are slightly different.
876*ccdc9c3eSSadaf Ebrahimi 
877*ccdc9c3eSSadaf Ebrahimi // Runs implementation to search for regexp in text, iters times.
878*ccdc9c3eSSadaf Ebrahimi // Expect_match says whether the regexp should be found.
879*ccdc9c3eSSadaf Ebrahimi // Anchored says whether to run an anchored search.
880*ccdc9c3eSSadaf Ebrahimi 
SearchDFA(int iters,const char * regexp,const StringPiece & text,Prog::Anchor anchor,bool expect_match)881*ccdc9c3eSSadaf Ebrahimi void SearchDFA(int iters, const char* regexp, const StringPiece& text,
882*ccdc9c3eSSadaf Ebrahimi             Prog::Anchor anchor, bool expect_match) {
883*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
884*ccdc9c3eSSadaf Ebrahimi     Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL);
885*ccdc9c3eSSadaf Ebrahimi     CHECK(re);
886*ccdc9c3eSSadaf Ebrahimi     Prog* prog = re->CompileToProg(0);
887*ccdc9c3eSSadaf Ebrahimi     CHECK(prog);
888*ccdc9c3eSSadaf Ebrahimi     bool failed = false;
889*ccdc9c3eSSadaf Ebrahimi     CHECK_EQ(prog->SearchDFA(text, StringPiece(), anchor, Prog::kFirstMatch,
890*ccdc9c3eSSadaf Ebrahimi                              NULL, &failed, NULL),
891*ccdc9c3eSSadaf Ebrahimi              expect_match);
892*ccdc9c3eSSadaf Ebrahimi     CHECK(!failed);
893*ccdc9c3eSSadaf Ebrahimi     delete prog;
894*ccdc9c3eSSadaf Ebrahimi     re->Decref();
895*ccdc9c3eSSadaf Ebrahimi   }
896*ccdc9c3eSSadaf Ebrahimi }
897*ccdc9c3eSSadaf Ebrahimi 
SearchNFA(int iters,const char * regexp,const StringPiece & text,Prog::Anchor anchor,bool expect_match)898*ccdc9c3eSSadaf Ebrahimi void SearchNFA(int iters, const char* regexp, const StringPiece& text,
899*ccdc9c3eSSadaf Ebrahimi             Prog::Anchor anchor, bool expect_match) {
900*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
901*ccdc9c3eSSadaf Ebrahimi     Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL);
902*ccdc9c3eSSadaf Ebrahimi     CHECK(re);
903*ccdc9c3eSSadaf Ebrahimi     Prog* prog = re->CompileToProg(0);
904*ccdc9c3eSSadaf Ebrahimi     CHECK(prog);
905*ccdc9c3eSSadaf Ebrahimi     CHECK_EQ(prog->SearchNFA(text, StringPiece(), anchor, Prog::kFirstMatch,
906*ccdc9c3eSSadaf Ebrahimi                              NULL, 0),
907*ccdc9c3eSSadaf Ebrahimi              expect_match);
908*ccdc9c3eSSadaf Ebrahimi     delete prog;
909*ccdc9c3eSSadaf Ebrahimi     re->Decref();
910*ccdc9c3eSSadaf Ebrahimi   }
911*ccdc9c3eSSadaf Ebrahimi }
912*ccdc9c3eSSadaf Ebrahimi 
SearchOnePass(int iters,const char * regexp,const StringPiece & text,Prog::Anchor anchor,bool expect_match)913*ccdc9c3eSSadaf Ebrahimi void SearchOnePass(int iters, const char* regexp, const StringPiece& text,
914*ccdc9c3eSSadaf Ebrahimi             Prog::Anchor anchor, bool expect_match) {
915*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
916*ccdc9c3eSSadaf Ebrahimi     Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL);
917*ccdc9c3eSSadaf Ebrahimi     CHECK(re);
918*ccdc9c3eSSadaf Ebrahimi     Prog* prog = re->CompileToProg(0);
919*ccdc9c3eSSadaf Ebrahimi     CHECK(prog);
920*ccdc9c3eSSadaf Ebrahimi     CHECK(prog->IsOnePass());
921*ccdc9c3eSSadaf Ebrahimi     CHECK_EQ(prog->SearchOnePass(text, text, anchor, Prog::kFirstMatch, NULL, 0),
922*ccdc9c3eSSadaf Ebrahimi              expect_match);
923*ccdc9c3eSSadaf Ebrahimi     delete prog;
924*ccdc9c3eSSadaf Ebrahimi     re->Decref();
925*ccdc9c3eSSadaf Ebrahimi   }
926*ccdc9c3eSSadaf Ebrahimi }
927*ccdc9c3eSSadaf Ebrahimi 
SearchBitState(int iters,const char * regexp,const StringPiece & text,Prog::Anchor anchor,bool expect_match)928*ccdc9c3eSSadaf Ebrahimi void SearchBitState(int iters, const char* regexp, const StringPiece& text,
929*ccdc9c3eSSadaf Ebrahimi             Prog::Anchor anchor, bool expect_match) {
930*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
931*ccdc9c3eSSadaf Ebrahimi     Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL);
932*ccdc9c3eSSadaf Ebrahimi     CHECK(re);
933*ccdc9c3eSSadaf Ebrahimi     Prog* prog = re->CompileToProg(0);
934*ccdc9c3eSSadaf Ebrahimi     CHECK(prog);
935*ccdc9c3eSSadaf Ebrahimi     CHECK_EQ(prog->SearchBitState(text, text, anchor, Prog::kFirstMatch, NULL, 0),
936*ccdc9c3eSSadaf Ebrahimi              expect_match);
937*ccdc9c3eSSadaf Ebrahimi     delete prog;
938*ccdc9c3eSSadaf Ebrahimi     re->Decref();
939*ccdc9c3eSSadaf Ebrahimi   }
940*ccdc9c3eSSadaf Ebrahimi }
941*ccdc9c3eSSadaf Ebrahimi 
SearchPCRE(int iters,const char * regexp,const StringPiece & text,Prog::Anchor anchor,bool expect_match)942*ccdc9c3eSSadaf Ebrahimi void SearchPCRE(int iters, const char* regexp, const StringPiece& text,
943*ccdc9c3eSSadaf Ebrahimi                 Prog::Anchor anchor, bool expect_match) {
944*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
945*ccdc9c3eSSadaf Ebrahimi     PCRE re(regexp, PCRE::UTF8);
946*ccdc9c3eSSadaf Ebrahimi     CHECK_EQ(re.error(), "");
947*ccdc9c3eSSadaf Ebrahimi     if (anchor == Prog::kAnchored)
948*ccdc9c3eSSadaf Ebrahimi       CHECK_EQ(PCRE::FullMatch(text, re), expect_match);
949*ccdc9c3eSSadaf Ebrahimi     else
950*ccdc9c3eSSadaf Ebrahimi       CHECK_EQ(PCRE::PartialMatch(text, re), expect_match);
951*ccdc9c3eSSadaf Ebrahimi   }
952*ccdc9c3eSSadaf Ebrahimi }
953*ccdc9c3eSSadaf Ebrahimi 
SearchRE2(int iters,const char * regexp,const StringPiece & text,Prog::Anchor anchor,bool expect_match)954*ccdc9c3eSSadaf Ebrahimi void SearchRE2(int iters, const char* regexp, const StringPiece& text,
955*ccdc9c3eSSadaf Ebrahimi                Prog::Anchor anchor, bool expect_match) {
956*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
957*ccdc9c3eSSadaf Ebrahimi     RE2 re(regexp);
958*ccdc9c3eSSadaf Ebrahimi     CHECK_EQ(re.error(), "");
959*ccdc9c3eSSadaf Ebrahimi     if (anchor == Prog::kAnchored)
960*ccdc9c3eSSadaf Ebrahimi       CHECK_EQ(RE2::FullMatch(text, re), expect_match);
961*ccdc9c3eSSadaf Ebrahimi     else
962*ccdc9c3eSSadaf Ebrahimi       CHECK_EQ(RE2::PartialMatch(text, re), expect_match);
963*ccdc9c3eSSadaf Ebrahimi   }
964*ccdc9c3eSSadaf Ebrahimi }
965*ccdc9c3eSSadaf Ebrahimi 
966*ccdc9c3eSSadaf Ebrahimi // SearchCachedXXX is like SearchXXX but only does the
967*ccdc9c3eSSadaf Ebrahimi // regexp parsing and compiling once.  This lets us measure
968*ccdc9c3eSSadaf Ebrahimi // search time without the per-regexp overhead.
969*ccdc9c3eSSadaf Ebrahimi 
SearchCachedDFA(int iters,const char * regexp,const StringPiece & text,Prog::Anchor anchor,bool expect_match)970*ccdc9c3eSSadaf Ebrahimi void SearchCachedDFA(int iters, const char* regexp, const StringPiece& text,
971*ccdc9c3eSSadaf Ebrahimi                      Prog::Anchor anchor, bool expect_match) {
972*ccdc9c3eSSadaf Ebrahimi   Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL);
973*ccdc9c3eSSadaf Ebrahimi   CHECK(re);
974*ccdc9c3eSSadaf Ebrahimi   Prog* prog = re->CompileToProg(1LL<<31);
975*ccdc9c3eSSadaf Ebrahimi   CHECK(prog);
976*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
977*ccdc9c3eSSadaf Ebrahimi     bool failed = false;
978*ccdc9c3eSSadaf Ebrahimi     CHECK_EQ(prog->SearchDFA(text, StringPiece(), anchor, Prog::kFirstMatch,
979*ccdc9c3eSSadaf Ebrahimi                              NULL, &failed, NULL),
980*ccdc9c3eSSadaf Ebrahimi              expect_match);
981*ccdc9c3eSSadaf Ebrahimi     CHECK(!failed);
982*ccdc9c3eSSadaf Ebrahimi   }
983*ccdc9c3eSSadaf Ebrahimi   delete prog;
984*ccdc9c3eSSadaf Ebrahimi   re->Decref();
985*ccdc9c3eSSadaf Ebrahimi }
986*ccdc9c3eSSadaf Ebrahimi 
SearchCachedNFA(int iters,const char * regexp,const StringPiece & text,Prog::Anchor anchor,bool expect_match)987*ccdc9c3eSSadaf Ebrahimi void SearchCachedNFA(int iters, const char* regexp, const StringPiece& text,
988*ccdc9c3eSSadaf Ebrahimi                      Prog::Anchor anchor, bool expect_match) {
989*ccdc9c3eSSadaf Ebrahimi   Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL);
990*ccdc9c3eSSadaf Ebrahimi   CHECK(re);
991*ccdc9c3eSSadaf Ebrahimi   Prog* prog = re->CompileToProg(0);
992*ccdc9c3eSSadaf Ebrahimi   CHECK(prog);
993*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
994*ccdc9c3eSSadaf Ebrahimi     CHECK_EQ(prog->SearchNFA(text, StringPiece(), anchor, Prog::kFirstMatch,
995*ccdc9c3eSSadaf Ebrahimi                              NULL, 0),
996*ccdc9c3eSSadaf Ebrahimi              expect_match);
997*ccdc9c3eSSadaf Ebrahimi   }
998*ccdc9c3eSSadaf Ebrahimi   delete prog;
999*ccdc9c3eSSadaf Ebrahimi   re->Decref();
1000*ccdc9c3eSSadaf Ebrahimi }
1001*ccdc9c3eSSadaf Ebrahimi 
SearchCachedOnePass(int iters,const char * regexp,const StringPiece & text,Prog::Anchor anchor,bool expect_match)1002*ccdc9c3eSSadaf Ebrahimi void SearchCachedOnePass(int iters, const char* regexp, const StringPiece& text,
1003*ccdc9c3eSSadaf Ebrahimi                      Prog::Anchor anchor, bool expect_match) {
1004*ccdc9c3eSSadaf Ebrahimi   Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL);
1005*ccdc9c3eSSadaf Ebrahimi   CHECK(re);
1006*ccdc9c3eSSadaf Ebrahimi   Prog* prog = re->CompileToProg(0);
1007*ccdc9c3eSSadaf Ebrahimi   CHECK(prog);
1008*ccdc9c3eSSadaf Ebrahimi   CHECK(prog->IsOnePass());
1009*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++)
1010*ccdc9c3eSSadaf Ebrahimi     CHECK_EQ(prog->SearchOnePass(text, text, anchor, Prog::kFirstMatch, NULL, 0),
1011*ccdc9c3eSSadaf Ebrahimi              expect_match);
1012*ccdc9c3eSSadaf Ebrahimi   delete prog;
1013*ccdc9c3eSSadaf Ebrahimi   re->Decref();
1014*ccdc9c3eSSadaf Ebrahimi }
1015*ccdc9c3eSSadaf Ebrahimi 
SearchCachedBitState(int iters,const char * regexp,const StringPiece & text,Prog::Anchor anchor,bool expect_match)1016*ccdc9c3eSSadaf Ebrahimi void SearchCachedBitState(int iters, const char* regexp, const StringPiece& text,
1017*ccdc9c3eSSadaf Ebrahimi                      Prog::Anchor anchor, bool expect_match) {
1018*ccdc9c3eSSadaf Ebrahimi   Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL);
1019*ccdc9c3eSSadaf Ebrahimi   CHECK(re);
1020*ccdc9c3eSSadaf Ebrahimi   Prog* prog = re->CompileToProg(0);
1021*ccdc9c3eSSadaf Ebrahimi   CHECK(prog);
1022*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++)
1023*ccdc9c3eSSadaf Ebrahimi     CHECK_EQ(prog->SearchBitState(text, text, anchor, Prog::kFirstMatch, NULL, 0),
1024*ccdc9c3eSSadaf Ebrahimi              expect_match);
1025*ccdc9c3eSSadaf Ebrahimi   delete prog;
1026*ccdc9c3eSSadaf Ebrahimi   re->Decref();
1027*ccdc9c3eSSadaf Ebrahimi }
1028*ccdc9c3eSSadaf Ebrahimi 
SearchCachedPCRE(int iters,const char * regexp,const StringPiece & text,Prog::Anchor anchor,bool expect_match)1029*ccdc9c3eSSadaf Ebrahimi void SearchCachedPCRE(int iters, const char* regexp, const StringPiece& text,
1030*ccdc9c3eSSadaf Ebrahimi                      Prog::Anchor anchor, bool expect_match) {
1031*ccdc9c3eSSadaf Ebrahimi   PCRE re(regexp, PCRE::UTF8);
1032*ccdc9c3eSSadaf Ebrahimi   CHECK_EQ(re.error(), "");
1033*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
1034*ccdc9c3eSSadaf Ebrahimi     if (anchor == Prog::kAnchored)
1035*ccdc9c3eSSadaf Ebrahimi       CHECK_EQ(PCRE::FullMatch(text, re), expect_match);
1036*ccdc9c3eSSadaf Ebrahimi     else
1037*ccdc9c3eSSadaf Ebrahimi       CHECK_EQ(PCRE::PartialMatch(text, re), expect_match);
1038*ccdc9c3eSSadaf Ebrahimi   }
1039*ccdc9c3eSSadaf Ebrahimi }
1040*ccdc9c3eSSadaf Ebrahimi 
SearchCachedRE2(int iters,const char * regexp,const StringPiece & text,Prog::Anchor anchor,bool expect_match)1041*ccdc9c3eSSadaf Ebrahimi void SearchCachedRE2(int iters, const char* regexp, const StringPiece& text,
1042*ccdc9c3eSSadaf Ebrahimi                      Prog::Anchor anchor, bool expect_match) {
1043*ccdc9c3eSSadaf Ebrahimi   RE2 re(regexp);
1044*ccdc9c3eSSadaf Ebrahimi   CHECK_EQ(re.error(), "");
1045*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
1046*ccdc9c3eSSadaf Ebrahimi     if (anchor == Prog::kAnchored)
1047*ccdc9c3eSSadaf Ebrahimi       CHECK_EQ(RE2::FullMatch(text, re), expect_match);
1048*ccdc9c3eSSadaf Ebrahimi     else
1049*ccdc9c3eSSadaf Ebrahimi       CHECK_EQ(RE2::PartialMatch(text, re), expect_match);
1050*ccdc9c3eSSadaf Ebrahimi   }
1051*ccdc9c3eSSadaf Ebrahimi }
1052*ccdc9c3eSSadaf Ebrahimi 
1053*ccdc9c3eSSadaf Ebrahimi 
1054*ccdc9c3eSSadaf Ebrahimi // Runs implementation to full match regexp against text,
1055*ccdc9c3eSSadaf Ebrahimi // extracting three submatches.  Expects match always.
1056*ccdc9c3eSSadaf Ebrahimi 
Parse3NFA(int iters,const char * regexp,const StringPiece & text)1057*ccdc9c3eSSadaf Ebrahimi void Parse3NFA(int iters, const char* regexp, const StringPiece& text) {
1058*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
1059*ccdc9c3eSSadaf Ebrahimi     Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL);
1060*ccdc9c3eSSadaf Ebrahimi     CHECK(re);
1061*ccdc9c3eSSadaf Ebrahimi     Prog* prog = re->CompileToProg(0);
1062*ccdc9c3eSSadaf Ebrahimi     CHECK(prog);
1063*ccdc9c3eSSadaf Ebrahimi     StringPiece sp[4];  // 4 because sp[0] is whole match.
1064*ccdc9c3eSSadaf Ebrahimi     CHECK(prog->SearchNFA(text, StringPiece(), Prog::kAnchored,
1065*ccdc9c3eSSadaf Ebrahimi                           Prog::kFullMatch, sp, 4));
1066*ccdc9c3eSSadaf Ebrahimi     delete prog;
1067*ccdc9c3eSSadaf Ebrahimi     re->Decref();
1068*ccdc9c3eSSadaf Ebrahimi   }
1069*ccdc9c3eSSadaf Ebrahimi }
1070*ccdc9c3eSSadaf Ebrahimi 
Parse3OnePass(int iters,const char * regexp,const StringPiece & text)1071*ccdc9c3eSSadaf Ebrahimi void Parse3OnePass(int iters, const char* regexp, const StringPiece& text) {
1072*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
1073*ccdc9c3eSSadaf Ebrahimi     Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL);
1074*ccdc9c3eSSadaf Ebrahimi     CHECK(re);
1075*ccdc9c3eSSadaf Ebrahimi     Prog* prog = re->CompileToProg(0);
1076*ccdc9c3eSSadaf Ebrahimi     CHECK(prog);
1077*ccdc9c3eSSadaf Ebrahimi     CHECK(prog->IsOnePass());
1078*ccdc9c3eSSadaf Ebrahimi     StringPiece sp[4];  // 4 because sp[0] is whole match.
1079*ccdc9c3eSSadaf Ebrahimi     CHECK(prog->SearchOnePass(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 4));
1080*ccdc9c3eSSadaf Ebrahimi     delete prog;
1081*ccdc9c3eSSadaf Ebrahimi     re->Decref();
1082*ccdc9c3eSSadaf Ebrahimi   }
1083*ccdc9c3eSSadaf Ebrahimi }
1084*ccdc9c3eSSadaf Ebrahimi 
Parse3BitState(int iters,const char * regexp,const StringPiece & text)1085*ccdc9c3eSSadaf Ebrahimi void Parse3BitState(int iters, const char* regexp, const StringPiece& text) {
1086*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
1087*ccdc9c3eSSadaf Ebrahimi     Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL);
1088*ccdc9c3eSSadaf Ebrahimi     CHECK(re);
1089*ccdc9c3eSSadaf Ebrahimi     Prog* prog = re->CompileToProg(0);
1090*ccdc9c3eSSadaf Ebrahimi     CHECK(prog);
1091*ccdc9c3eSSadaf Ebrahimi     StringPiece sp[4];  // 4 because sp[0] is whole match.
1092*ccdc9c3eSSadaf Ebrahimi     CHECK(prog->SearchBitState(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 4));
1093*ccdc9c3eSSadaf Ebrahimi     delete prog;
1094*ccdc9c3eSSadaf Ebrahimi     re->Decref();
1095*ccdc9c3eSSadaf Ebrahimi   }
1096*ccdc9c3eSSadaf Ebrahimi }
1097*ccdc9c3eSSadaf Ebrahimi 
Parse3Backtrack(int iters,const char * regexp,const StringPiece & text)1098*ccdc9c3eSSadaf Ebrahimi void Parse3Backtrack(int iters, const char* regexp, const StringPiece& text) {
1099*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
1100*ccdc9c3eSSadaf Ebrahimi     Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL);
1101*ccdc9c3eSSadaf Ebrahimi     CHECK(re);
1102*ccdc9c3eSSadaf Ebrahimi     Prog* prog = re->CompileToProg(0);
1103*ccdc9c3eSSadaf Ebrahimi     CHECK(prog);
1104*ccdc9c3eSSadaf Ebrahimi     StringPiece sp[4];  // 4 because sp[0] is whole match.
1105*ccdc9c3eSSadaf Ebrahimi     CHECK(prog->UnsafeSearchBacktrack(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 4));
1106*ccdc9c3eSSadaf Ebrahimi     delete prog;
1107*ccdc9c3eSSadaf Ebrahimi     re->Decref();
1108*ccdc9c3eSSadaf Ebrahimi   }
1109*ccdc9c3eSSadaf Ebrahimi }
1110*ccdc9c3eSSadaf Ebrahimi 
Parse3PCRE(int iters,const char * regexp,const StringPiece & text)1111*ccdc9c3eSSadaf Ebrahimi void Parse3PCRE(int iters, const char* regexp, const StringPiece& text) {
1112*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
1113*ccdc9c3eSSadaf Ebrahimi     PCRE re(regexp, PCRE::UTF8);
1114*ccdc9c3eSSadaf Ebrahimi     CHECK_EQ(re.error(), "");
1115*ccdc9c3eSSadaf Ebrahimi     StringPiece sp1, sp2, sp3;
1116*ccdc9c3eSSadaf Ebrahimi     CHECK(PCRE::FullMatch(text, re, &sp1, &sp2, &sp3));
1117*ccdc9c3eSSadaf Ebrahimi   }
1118*ccdc9c3eSSadaf Ebrahimi }
1119*ccdc9c3eSSadaf Ebrahimi 
Parse3RE2(int iters,const char * regexp,const StringPiece & text)1120*ccdc9c3eSSadaf Ebrahimi void Parse3RE2(int iters, const char* regexp, const StringPiece& text) {
1121*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
1122*ccdc9c3eSSadaf Ebrahimi     RE2 re(regexp);
1123*ccdc9c3eSSadaf Ebrahimi     CHECK_EQ(re.error(), "");
1124*ccdc9c3eSSadaf Ebrahimi     StringPiece sp1, sp2, sp3;
1125*ccdc9c3eSSadaf Ebrahimi     CHECK(RE2::FullMatch(text, re, &sp1, &sp2, &sp3));
1126*ccdc9c3eSSadaf Ebrahimi   }
1127*ccdc9c3eSSadaf Ebrahimi }
1128*ccdc9c3eSSadaf Ebrahimi 
Parse3CachedNFA(int iters,const char * regexp,const StringPiece & text)1129*ccdc9c3eSSadaf Ebrahimi void Parse3CachedNFA(int iters, const char* regexp, const StringPiece& text) {
1130*ccdc9c3eSSadaf Ebrahimi   Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL);
1131*ccdc9c3eSSadaf Ebrahimi   CHECK(re);
1132*ccdc9c3eSSadaf Ebrahimi   Prog* prog = re->CompileToProg(0);
1133*ccdc9c3eSSadaf Ebrahimi   CHECK(prog);
1134*ccdc9c3eSSadaf Ebrahimi   StringPiece sp[4];  // 4 because sp[0] is whole match.
1135*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
1136*ccdc9c3eSSadaf Ebrahimi     CHECK(prog->SearchNFA(text, StringPiece(), Prog::kAnchored,
1137*ccdc9c3eSSadaf Ebrahimi                           Prog::kFullMatch, sp, 4));
1138*ccdc9c3eSSadaf Ebrahimi   }
1139*ccdc9c3eSSadaf Ebrahimi   delete prog;
1140*ccdc9c3eSSadaf Ebrahimi   re->Decref();
1141*ccdc9c3eSSadaf Ebrahimi }
1142*ccdc9c3eSSadaf Ebrahimi 
Parse3CachedOnePass(int iters,const char * regexp,const StringPiece & text)1143*ccdc9c3eSSadaf Ebrahimi void Parse3CachedOnePass(int iters, const char* regexp, const StringPiece& text) {
1144*ccdc9c3eSSadaf Ebrahimi   Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL);
1145*ccdc9c3eSSadaf Ebrahimi   CHECK(re);
1146*ccdc9c3eSSadaf Ebrahimi   Prog* prog = re->CompileToProg(0);
1147*ccdc9c3eSSadaf Ebrahimi   CHECK(prog);
1148*ccdc9c3eSSadaf Ebrahimi   CHECK(prog->IsOnePass());
1149*ccdc9c3eSSadaf Ebrahimi   StringPiece sp[4];  // 4 because sp[0] is whole match.
1150*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++)
1151*ccdc9c3eSSadaf Ebrahimi     CHECK(prog->SearchOnePass(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 4));
1152*ccdc9c3eSSadaf Ebrahimi   delete prog;
1153*ccdc9c3eSSadaf Ebrahimi   re->Decref();
1154*ccdc9c3eSSadaf Ebrahimi }
1155*ccdc9c3eSSadaf Ebrahimi 
Parse3CachedBitState(int iters,const char * regexp,const StringPiece & text)1156*ccdc9c3eSSadaf Ebrahimi void Parse3CachedBitState(int iters, const char* regexp, const StringPiece& text) {
1157*ccdc9c3eSSadaf Ebrahimi   Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL);
1158*ccdc9c3eSSadaf Ebrahimi   CHECK(re);
1159*ccdc9c3eSSadaf Ebrahimi   Prog* prog = re->CompileToProg(0);
1160*ccdc9c3eSSadaf Ebrahimi   CHECK(prog);
1161*ccdc9c3eSSadaf Ebrahimi   StringPiece sp[4];  // 4 because sp[0] is whole match.
1162*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++)
1163*ccdc9c3eSSadaf Ebrahimi     CHECK(prog->SearchBitState(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 4));
1164*ccdc9c3eSSadaf Ebrahimi   delete prog;
1165*ccdc9c3eSSadaf Ebrahimi   re->Decref();
1166*ccdc9c3eSSadaf Ebrahimi }
1167*ccdc9c3eSSadaf Ebrahimi 
Parse3CachedBacktrack(int iters,const char * regexp,const StringPiece & text)1168*ccdc9c3eSSadaf Ebrahimi void Parse3CachedBacktrack(int iters, const char* regexp, const StringPiece& text) {
1169*ccdc9c3eSSadaf Ebrahimi   Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL);
1170*ccdc9c3eSSadaf Ebrahimi   CHECK(re);
1171*ccdc9c3eSSadaf Ebrahimi   Prog* prog = re->CompileToProg(0);
1172*ccdc9c3eSSadaf Ebrahimi   CHECK(prog);
1173*ccdc9c3eSSadaf Ebrahimi   StringPiece sp[4];  // 4 because sp[0] is whole match.
1174*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++)
1175*ccdc9c3eSSadaf Ebrahimi     CHECK(prog->UnsafeSearchBacktrack(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 4));
1176*ccdc9c3eSSadaf Ebrahimi   delete prog;
1177*ccdc9c3eSSadaf Ebrahimi   re->Decref();
1178*ccdc9c3eSSadaf Ebrahimi }
1179*ccdc9c3eSSadaf Ebrahimi 
Parse3CachedPCRE(int iters,const char * regexp,const StringPiece & text)1180*ccdc9c3eSSadaf Ebrahimi void Parse3CachedPCRE(int iters, const char* regexp, const StringPiece& text) {
1181*ccdc9c3eSSadaf Ebrahimi   PCRE re(regexp, PCRE::UTF8);
1182*ccdc9c3eSSadaf Ebrahimi   CHECK_EQ(re.error(), "");
1183*ccdc9c3eSSadaf Ebrahimi   StringPiece sp1, sp2, sp3;
1184*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
1185*ccdc9c3eSSadaf Ebrahimi     CHECK(PCRE::FullMatch(text, re, &sp1, &sp2, &sp3));
1186*ccdc9c3eSSadaf Ebrahimi   }
1187*ccdc9c3eSSadaf Ebrahimi }
1188*ccdc9c3eSSadaf Ebrahimi 
Parse3CachedRE2(int iters,const char * regexp,const StringPiece & text)1189*ccdc9c3eSSadaf Ebrahimi void Parse3CachedRE2(int iters, const char* regexp, const StringPiece& text) {
1190*ccdc9c3eSSadaf Ebrahimi   RE2 re(regexp);
1191*ccdc9c3eSSadaf Ebrahimi   CHECK_EQ(re.error(), "");
1192*ccdc9c3eSSadaf Ebrahimi   StringPiece sp1, sp2, sp3;
1193*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
1194*ccdc9c3eSSadaf Ebrahimi     CHECK(RE2::FullMatch(text, re, &sp1, &sp2, &sp3));
1195*ccdc9c3eSSadaf Ebrahimi   }
1196*ccdc9c3eSSadaf Ebrahimi }
1197*ccdc9c3eSSadaf Ebrahimi 
1198*ccdc9c3eSSadaf Ebrahimi 
1199*ccdc9c3eSSadaf Ebrahimi // Runs implementation to full match regexp against text,
1200*ccdc9c3eSSadaf Ebrahimi // extracting three submatches.  Expects match always.
1201*ccdc9c3eSSadaf Ebrahimi 
Parse1NFA(int iters,const char * regexp,const StringPiece & text)1202*ccdc9c3eSSadaf Ebrahimi void Parse1NFA(int iters, const char* regexp, const StringPiece& text) {
1203*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
1204*ccdc9c3eSSadaf Ebrahimi     Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL);
1205*ccdc9c3eSSadaf Ebrahimi     CHECK(re);
1206*ccdc9c3eSSadaf Ebrahimi     Prog* prog = re->CompileToProg(0);
1207*ccdc9c3eSSadaf Ebrahimi     CHECK(prog);
1208*ccdc9c3eSSadaf Ebrahimi     StringPiece sp[2];  // 2 because sp[0] is whole match.
1209*ccdc9c3eSSadaf Ebrahimi     CHECK(prog->SearchNFA(text, StringPiece(), Prog::kAnchored,
1210*ccdc9c3eSSadaf Ebrahimi                           Prog::kFullMatch, sp, 2));
1211*ccdc9c3eSSadaf Ebrahimi     delete prog;
1212*ccdc9c3eSSadaf Ebrahimi     re->Decref();
1213*ccdc9c3eSSadaf Ebrahimi   }
1214*ccdc9c3eSSadaf Ebrahimi }
1215*ccdc9c3eSSadaf Ebrahimi 
Parse1OnePass(int iters,const char * regexp,const StringPiece & text)1216*ccdc9c3eSSadaf Ebrahimi void Parse1OnePass(int iters, const char* regexp, const StringPiece& text) {
1217*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
1218*ccdc9c3eSSadaf Ebrahimi     Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL);
1219*ccdc9c3eSSadaf Ebrahimi     CHECK(re);
1220*ccdc9c3eSSadaf Ebrahimi     Prog* prog = re->CompileToProg(0);
1221*ccdc9c3eSSadaf Ebrahimi     CHECK(prog);
1222*ccdc9c3eSSadaf Ebrahimi     CHECK(prog->IsOnePass());
1223*ccdc9c3eSSadaf Ebrahimi     StringPiece sp[2];  // 2 because sp[0] is whole match.
1224*ccdc9c3eSSadaf Ebrahimi     CHECK(prog->SearchOnePass(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 2));
1225*ccdc9c3eSSadaf Ebrahimi     delete prog;
1226*ccdc9c3eSSadaf Ebrahimi     re->Decref();
1227*ccdc9c3eSSadaf Ebrahimi   }
1228*ccdc9c3eSSadaf Ebrahimi }
1229*ccdc9c3eSSadaf Ebrahimi 
Parse1BitState(int iters,const char * regexp,const StringPiece & text)1230*ccdc9c3eSSadaf Ebrahimi void Parse1BitState(int iters, const char* regexp, const StringPiece& text) {
1231*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
1232*ccdc9c3eSSadaf Ebrahimi     Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL);
1233*ccdc9c3eSSadaf Ebrahimi     CHECK(re);
1234*ccdc9c3eSSadaf Ebrahimi     Prog* prog = re->CompileToProg(0);
1235*ccdc9c3eSSadaf Ebrahimi     CHECK(prog);
1236*ccdc9c3eSSadaf Ebrahimi     StringPiece sp[2];  // 2 because sp[0] is whole match.
1237*ccdc9c3eSSadaf Ebrahimi     CHECK(prog->SearchBitState(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 2));
1238*ccdc9c3eSSadaf Ebrahimi     delete prog;
1239*ccdc9c3eSSadaf Ebrahimi     re->Decref();
1240*ccdc9c3eSSadaf Ebrahimi   }
1241*ccdc9c3eSSadaf Ebrahimi }
1242*ccdc9c3eSSadaf Ebrahimi 
Parse1PCRE(int iters,const char * regexp,const StringPiece & text)1243*ccdc9c3eSSadaf Ebrahimi void Parse1PCRE(int iters, const char* regexp, const StringPiece& text) {
1244*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
1245*ccdc9c3eSSadaf Ebrahimi     PCRE re(regexp, PCRE::UTF8);
1246*ccdc9c3eSSadaf Ebrahimi     CHECK_EQ(re.error(), "");
1247*ccdc9c3eSSadaf Ebrahimi     StringPiece sp1;
1248*ccdc9c3eSSadaf Ebrahimi     CHECK(PCRE::FullMatch(text, re, &sp1));
1249*ccdc9c3eSSadaf Ebrahimi   }
1250*ccdc9c3eSSadaf Ebrahimi }
1251*ccdc9c3eSSadaf Ebrahimi 
Parse1RE2(int iters,const char * regexp,const StringPiece & text)1252*ccdc9c3eSSadaf Ebrahimi void Parse1RE2(int iters, const char* regexp, const StringPiece& text) {
1253*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
1254*ccdc9c3eSSadaf Ebrahimi     RE2 re(regexp);
1255*ccdc9c3eSSadaf Ebrahimi     CHECK_EQ(re.error(), "");
1256*ccdc9c3eSSadaf Ebrahimi     StringPiece sp1;
1257*ccdc9c3eSSadaf Ebrahimi     CHECK(RE2::FullMatch(text, re, &sp1));
1258*ccdc9c3eSSadaf Ebrahimi   }
1259*ccdc9c3eSSadaf Ebrahimi }
1260*ccdc9c3eSSadaf Ebrahimi 
Parse1CachedNFA(int iters,const char * regexp,const StringPiece & text)1261*ccdc9c3eSSadaf Ebrahimi void Parse1CachedNFA(int iters, const char* regexp, const StringPiece& text) {
1262*ccdc9c3eSSadaf Ebrahimi   Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL);
1263*ccdc9c3eSSadaf Ebrahimi   CHECK(re);
1264*ccdc9c3eSSadaf Ebrahimi   Prog* prog = re->CompileToProg(0);
1265*ccdc9c3eSSadaf Ebrahimi   CHECK(prog);
1266*ccdc9c3eSSadaf Ebrahimi   StringPiece sp[2];  // 2 because sp[0] is whole match.
1267*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
1268*ccdc9c3eSSadaf Ebrahimi     CHECK(prog->SearchNFA(text, StringPiece(), Prog::kAnchored,
1269*ccdc9c3eSSadaf Ebrahimi                           Prog::kFullMatch, sp, 2));
1270*ccdc9c3eSSadaf Ebrahimi   }
1271*ccdc9c3eSSadaf Ebrahimi   delete prog;
1272*ccdc9c3eSSadaf Ebrahimi   re->Decref();
1273*ccdc9c3eSSadaf Ebrahimi }
1274*ccdc9c3eSSadaf Ebrahimi 
Parse1CachedOnePass(int iters,const char * regexp,const StringPiece & text)1275*ccdc9c3eSSadaf Ebrahimi void Parse1CachedOnePass(int iters, const char* regexp, const StringPiece& text) {
1276*ccdc9c3eSSadaf Ebrahimi   Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL);
1277*ccdc9c3eSSadaf Ebrahimi   CHECK(re);
1278*ccdc9c3eSSadaf Ebrahimi   Prog* prog = re->CompileToProg(0);
1279*ccdc9c3eSSadaf Ebrahimi   CHECK(prog);
1280*ccdc9c3eSSadaf Ebrahimi   CHECK(prog->IsOnePass());
1281*ccdc9c3eSSadaf Ebrahimi   StringPiece sp[2];  // 2 because sp[0] is whole match.
1282*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++)
1283*ccdc9c3eSSadaf Ebrahimi     CHECK(prog->SearchOnePass(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 2));
1284*ccdc9c3eSSadaf Ebrahimi   delete prog;
1285*ccdc9c3eSSadaf Ebrahimi   re->Decref();
1286*ccdc9c3eSSadaf Ebrahimi }
1287*ccdc9c3eSSadaf Ebrahimi 
Parse1CachedBitState(int iters,const char * regexp,const StringPiece & text)1288*ccdc9c3eSSadaf Ebrahimi void Parse1CachedBitState(int iters, const char* regexp, const StringPiece& text) {
1289*ccdc9c3eSSadaf Ebrahimi   Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL);
1290*ccdc9c3eSSadaf Ebrahimi   CHECK(re);
1291*ccdc9c3eSSadaf Ebrahimi   Prog* prog = re->CompileToProg(0);
1292*ccdc9c3eSSadaf Ebrahimi   CHECK(prog);
1293*ccdc9c3eSSadaf Ebrahimi   StringPiece sp[2];  // 2 because sp[0] is whole match.
1294*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++)
1295*ccdc9c3eSSadaf Ebrahimi     CHECK(prog->SearchBitState(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 2));
1296*ccdc9c3eSSadaf Ebrahimi   delete prog;
1297*ccdc9c3eSSadaf Ebrahimi   re->Decref();
1298*ccdc9c3eSSadaf Ebrahimi }
1299*ccdc9c3eSSadaf Ebrahimi 
Parse1CachedBacktrack(int iters,const char * regexp,const StringPiece & text)1300*ccdc9c3eSSadaf Ebrahimi void Parse1CachedBacktrack(int iters, const char* regexp, const StringPiece& text) {
1301*ccdc9c3eSSadaf Ebrahimi   Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL);
1302*ccdc9c3eSSadaf Ebrahimi   CHECK(re);
1303*ccdc9c3eSSadaf Ebrahimi   Prog* prog = re->CompileToProg(0);
1304*ccdc9c3eSSadaf Ebrahimi   CHECK(prog);
1305*ccdc9c3eSSadaf Ebrahimi   StringPiece sp[2];  // 2 because sp[0] is whole match.
1306*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++)
1307*ccdc9c3eSSadaf Ebrahimi     CHECK(prog->UnsafeSearchBacktrack(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 2));
1308*ccdc9c3eSSadaf Ebrahimi   delete prog;
1309*ccdc9c3eSSadaf Ebrahimi   re->Decref();
1310*ccdc9c3eSSadaf Ebrahimi }
1311*ccdc9c3eSSadaf Ebrahimi 
Parse1CachedPCRE(int iters,const char * regexp,const StringPiece & text)1312*ccdc9c3eSSadaf Ebrahimi void Parse1CachedPCRE(int iters, const char* regexp, const StringPiece& text) {
1313*ccdc9c3eSSadaf Ebrahimi   PCRE re(regexp, PCRE::UTF8);
1314*ccdc9c3eSSadaf Ebrahimi   CHECK_EQ(re.error(), "");
1315*ccdc9c3eSSadaf Ebrahimi   StringPiece sp1;
1316*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
1317*ccdc9c3eSSadaf Ebrahimi     CHECK(PCRE::FullMatch(text, re, &sp1));
1318*ccdc9c3eSSadaf Ebrahimi   }
1319*ccdc9c3eSSadaf Ebrahimi }
1320*ccdc9c3eSSadaf Ebrahimi 
Parse1CachedRE2(int iters,const char * regexp,const StringPiece & text)1321*ccdc9c3eSSadaf Ebrahimi void Parse1CachedRE2(int iters, const char* regexp, const StringPiece& text) {
1322*ccdc9c3eSSadaf Ebrahimi   RE2 re(regexp);
1323*ccdc9c3eSSadaf Ebrahimi   CHECK_EQ(re.error(), "");
1324*ccdc9c3eSSadaf Ebrahimi   StringPiece sp1;
1325*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
1326*ccdc9c3eSSadaf Ebrahimi     CHECK(RE2::FullMatch(text, re, &sp1));
1327*ccdc9c3eSSadaf Ebrahimi   }
1328*ccdc9c3eSSadaf Ebrahimi }
1329*ccdc9c3eSSadaf Ebrahimi 
SearchParse2CachedPCRE(int iters,const char * regexp,const StringPiece & text)1330*ccdc9c3eSSadaf Ebrahimi void SearchParse2CachedPCRE(int iters, const char* regexp,
1331*ccdc9c3eSSadaf Ebrahimi                             const StringPiece& text) {
1332*ccdc9c3eSSadaf Ebrahimi   PCRE re(regexp, PCRE::UTF8);
1333*ccdc9c3eSSadaf Ebrahimi   CHECK_EQ(re.error(), "");
1334*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
1335*ccdc9c3eSSadaf Ebrahimi     StringPiece sp1, sp2;
1336*ccdc9c3eSSadaf Ebrahimi     CHECK(PCRE::PartialMatch(text, re, &sp1, &sp2));
1337*ccdc9c3eSSadaf Ebrahimi   }
1338*ccdc9c3eSSadaf Ebrahimi }
1339*ccdc9c3eSSadaf Ebrahimi 
SearchParse2CachedRE2(int iters,const char * regexp,const StringPiece & text)1340*ccdc9c3eSSadaf Ebrahimi void SearchParse2CachedRE2(int iters, const char* regexp,
1341*ccdc9c3eSSadaf Ebrahimi                            const StringPiece& text) {
1342*ccdc9c3eSSadaf Ebrahimi   RE2 re(regexp);
1343*ccdc9c3eSSadaf Ebrahimi   CHECK_EQ(re.error(), "");
1344*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
1345*ccdc9c3eSSadaf Ebrahimi     StringPiece sp1, sp2;
1346*ccdc9c3eSSadaf Ebrahimi     CHECK(RE2::PartialMatch(text, re, &sp1, &sp2));
1347*ccdc9c3eSSadaf Ebrahimi   }
1348*ccdc9c3eSSadaf Ebrahimi }
1349*ccdc9c3eSSadaf Ebrahimi 
SearchParse1CachedPCRE(int iters,const char * regexp,const StringPiece & text)1350*ccdc9c3eSSadaf Ebrahimi void SearchParse1CachedPCRE(int iters, const char* regexp,
1351*ccdc9c3eSSadaf Ebrahimi                             const StringPiece& text) {
1352*ccdc9c3eSSadaf Ebrahimi   PCRE re(regexp, PCRE::UTF8);
1353*ccdc9c3eSSadaf Ebrahimi   CHECK_EQ(re.error(), "");
1354*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
1355*ccdc9c3eSSadaf Ebrahimi     StringPiece sp1;
1356*ccdc9c3eSSadaf Ebrahimi     CHECK(PCRE::PartialMatch(text, re, &sp1));
1357*ccdc9c3eSSadaf Ebrahimi   }
1358*ccdc9c3eSSadaf Ebrahimi }
1359*ccdc9c3eSSadaf Ebrahimi 
SearchParse1CachedRE2(int iters,const char * regexp,const StringPiece & text)1360*ccdc9c3eSSadaf Ebrahimi void SearchParse1CachedRE2(int iters, const char* regexp,
1361*ccdc9c3eSSadaf Ebrahimi                            const StringPiece& text) {
1362*ccdc9c3eSSadaf Ebrahimi   RE2 re(regexp);
1363*ccdc9c3eSSadaf Ebrahimi   CHECK_EQ(re.error(), "");
1364*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iters; i++) {
1365*ccdc9c3eSSadaf Ebrahimi     StringPiece sp1;
1366*ccdc9c3eSSadaf Ebrahimi     CHECK(RE2::PartialMatch(text, re, &sp1));
1367*ccdc9c3eSSadaf Ebrahimi   }
1368*ccdc9c3eSSadaf Ebrahimi }
1369*ccdc9c3eSSadaf Ebrahimi 
EmptyPartialMatchPCRE(int n)1370*ccdc9c3eSSadaf Ebrahimi void EmptyPartialMatchPCRE(int n) {
1371*ccdc9c3eSSadaf Ebrahimi   PCRE re("");
1372*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < n; i++) {
1373*ccdc9c3eSSadaf Ebrahimi     PCRE::PartialMatch("", re);
1374*ccdc9c3eSSadaf Ebrahimi   }
1375*ccdc9c3eSSadaf Ebrahimi }
1376*ccdc9c3eSSadaf Ebrahimi 
EmptyPartialMatchRE2(int n)1377*ccdc9c3eSSadaf Ebrahimi void EmptyPartialMatchRE2(int n) {
1378*ccdc9c3eSSadaf Ebrahimi   RE2 re("");
1379*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < n; i++) {
1380*ccdc9c3eSSadaf Ebrahimi     RE2::PartialMatch("", re);
1381*ccdc9c3eSSadaf Ebrahimi   }
1382*ccdc9c3eSSadaf Ebrahimi }
1383*ccdc9c3eSSadaf Ebrahimi #ifdef USEPCRE
1384*ccdc9c3eSSadaf Ebrahimi BENCHMARK(EmptyPartialMatchPCRE)->ThreadRange(1, NumCPUs());
1385*ccdc9c3eSSadaf Ebrahimi #endif
1386*ccdc9c3eSSadaf Ebrahimi BENCHMARK(EmptyPartialMatchRE2)->ThreadRange(1, NumCPUs());
1387*ccdc9c3eSSadaf Ebrahimi 
SimplePartialMatchPCRE(int n)1388*ccdc9c3eSSadaf Ebrahimi void SimplePartialMatchPCRE(int n) {
1389*ccdc9c3eSSadaf Ebrahimi   PCRE re("abcdefg");
1390*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < n; i++) {
1391*ccdc9c3eSSadaf Ebrahimi     PCRE::PartialMatch("abcdefg", re);
1392*ccdc9c3eSSadaf Ebrahimi   }
1393*ccdc9c3eSSadaf Ebrahimi }
1394*ccdc9c3eSSadaf Ebrahimi 
SimplePartialMatchRE2(int n)1395*ccdc9c3eSSadaf Ebrahimi void SimplePartialMatchRE2(int n) {
1396*ccdc9c3eSSadaf Ebrahimi   RE2 re("abcdefg");
1397*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < n; i++) {
1398*ccdc9c3eSSadaf Ebrahimi     RE2::PartialMatch("abcdefg", re);
1399*ccdc9c3eSSadaf Ebrahimi   }
1400*ccdc9c3eSSadaf Ebrahimi }
1401*ccdc9c3eSSadaf Ebrahimi #ifdef USEPCRE
1402*ccdc9c3eSSadaf Ebrahimi BENCHMARK(SimplePartialMatchPCRE)->ThreadRange(1, NumCPUs());
1403*ccdc9c3eSSadaf Ebrahimi #endif
1404*ccdc9c3eSSadaf Ebrahimi BENCHMARK(SimplePartialMatchRE2)->ThreadRange(1, NumCPUs());
1405*ccdc9c3eSSadaf Ebrahimi 
1406*ccdc9c3eSSadaf Ebrahimi static string http_text =
1407*ccdc9c3eSSadaf Ebrahimi   "GET /asdfhjasdhfasdlfhasdflkjasdfkljasdhflaskdjhf"
1408*ccdc9c3eSSadaf Ebrahimi   "alksdjfhasdlkfhasdlkjfhasdljkfhadsjklf HTTP/1.1";
1409*ccdc9c3eSSadaf Ebrahimi 
HTTPPartialMatchPCRE(int n)1410*ccdc9c3eSSadaf Ebrahimi void HTTPPartialMatchPCRE(int n) {
1411*ccdc9c3eSSadaf Ebrahimi   StringPiece a;
1412*ccdc9c3eSSadaf Ebrahimi   PCRE re("(?-s)^(?:GET|POST) +([^ ]+) HTTP");
1413*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < n; i++) {
1414*ccdc9c3eSSadaf Ebrahimi     PCRE::PartialMatch(http_text, re, &a);
1415*ccdc9c3eSSadaf Ebrahimi   }
1416*ccdc9c3eSSadaf Ebrahimi }
1417*ccdc9c3eSSadaf Ebrahimi 
HTTPPartialMatchRE2(int n)1418*ccdc9c3eSSadaf Ebrahimi void HTTPPartialMatchRE2(int n) {
1419*ccdc9c3eSSadaf Ebrahimi   StringPiece a;
1420*ccdc9c3eSSadaf Ebrahimi   RE2 re("(?-s)^(?:GET|POST) +([^ ]+) HTTP");
1421*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < n; i++) {
1422*ccdc9c3eSSadaf Ebrahimi     RE2::PartialMatch(http_text, re, &a);
1423*ccdc9c3eSSadaf Ebrahimi   }
1424*ccdc9c3eSSadaf Ebrahimi }
1425*ccdc9c3eSSadaf Ebrahimi 
1426*ccdc9c3eSSadaf Ebrahimi #ifdef USEPCRE
1427*ccdc9c3eSSadaf Ebrahimi BENCHMARK(HTTPPartialMatchPCRE)->ThreadRange(1, NumCPUs());
1428*ccdc9c3eSSadaf Ebrahimi #endif
1429*ccdc9c3eSSadaf Ebrahimi BENCHMARK(HTTPPartialMatchRE2)->ThreadRange(1, NumCPUs());
1430*ccdc9c3eSSadaf Ebrahimi 
1431*ccdc9c3eSSadaf Ebrahimi static string smallhttp_text =
1432*ccdc9c3eSSadaf Ebrahimi   "GET /abc HTTP/1.1";
1433*ccdc9c3eSSadaf Ebrahimi 
SmallHTTPPartialMatchPCRE(int n)1434*ccdc9c3eSSadaf Ebrahimi void SmallHTTPPartialMatchPCRE(int n) {
1435*ccdc9c3eSSadaf Ebrahimi   StringPiece a;
1436*ccdc9c3eSSadaf Ebrahimi   PCRE re("(?-s)^(?:GET|POST) +([^ ]+) HTTP");
1437*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < n; i++) {
1438*ccdc9c3eSSadaf Ebrahimi     PCRE::PartialMatch(smallhttp_text, re, &a);
1439*ccdc9c3eSSadaf Ebrahimi   }
1440*ccdc9c3eSSadaf Ebrahimi }
1441*ccdc9c3eSSadaf Ebrahimi 
SmallHTTPPartialMatchRE2(int n)1442*ccdc9c3eSSadaf Ebrahimi void SmallHTTPPartialMatchRE2(int n) {
1443*ccdc9c3eSSadaf Ebrahimi   StringPiece a;
1444*ccdc9c3eSSadaf Ebrahimi   RE2 re("(?-s)^(?:GET|POST) +([^ ]+) HTTP");
1445*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < n; i++) {
1446*ccdc9c3eSSadaf Ebrahimi     RE2::PartialMatch(smallhttp_text, re, &a);
1447*ccdc9c3eSSadaf Ebrahimi   }
1448*ccdc9c3eSSadaf Ebrahimi }
1449*ccdc9c3eSSadaf Ebrahimi 
1450*ccdc9c3eSSadaf Ebrahimi #ifdef USEPCRE
1451*ccdc9c3eSSadaf Ebrahimi BENCHMARK(SmallHTTPPartialMatchPCRE)->ThreadRange(1, NumCPUs());
1452*ccdc9c3eSSadaf Ebrahimi #endif
1453*ccdc9c3eSSadaf Ebrahimi BENCHMARK(SmallHTTPPartialMatchRE2)->ThreadRange(1, NumCPUs());
1454*ccdc9c3eSSadaf Ebrahimi 
DotMatchPCRE(int n)1455*ccdc9c3eSSadaf Ebrahimi void DotMatchPCRE(int n) {
1456*ccdc9c3eSSadaf Ebrahimi   StringPiece a;
1457*ccdc9c3eSSadaf Ebrahimi   PCRE re("(?-s)^(.+)");
1458*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < n; i++) {
1459*ccdc9c3eSSadaf Ebrahimi     PCRE::PartialMatch(http_text, re, &a);
1460*ccdc9c3eSSadaf Ebrahimi   }
1461*ccdc9c3eSSadaf Ebrahimi }
1462*ccdc9c3eSSadaf Ebrahimi 
DotMatchRE2(int n)1463*ccdc9c3eSSadaf Ebrahimi void DotMatchRE2(int n) {
1464*ccdc9c3eSSadaf Ebrahimi   StringPiece a;
1465*ccdc9c3eSSadaf Ebrahimi   RE2 re("(?-s)^(.+)");
1466*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < n; i++) {
1467*ccdc9c3eSSadaf Ebrahimi     RE2::PartialMatch(http_text, re, &a);
1468*ccdc9c3eSSadaf Ebrahimi   }
1469*ccdc9c3eSSadaf Ebrahimi }
1470*ccdc9c3eSSadaf Ebrahimi 
1471*ccdc9c3eSSadaf Ebrahimi #ifdef USEPCRE
1472*ccdc9c3eSSadaf Ebrahimi BENCHMARK(DotMatchPCRE)->ThreadRange(1, NumCPUs());
1473*ccdc9c3eSSadaf Ebrahimi #endif
1474*ccdc9c3eSSadaf Ebrahimi BENCHMARK(DotMatchRE2)->ThreadRange(1, NumCPUs());
1475*ccdc9c3eSSadaf Ebrahimi 
ASCIIMatchPCRE(int n)1476*ccdc9c3eSSadaf Ebrahimi void ASCIIMatchPCRE(int n) {
1477*ccdc9c3eSSadaf Ebrahimi   StringPiece a;
1478*ccdc9c3eSSadaf Ebrahimi   PCRE re("(?-s)^([ -~]+)");
1479*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < n; i++) {
1480*ccdc9c3eSSadaf Ebrahimi     PCRE::PartialMatch(http_text, re, &a);
1481*ccdc9c3eSSadaf Ebrahimi   }
1482*ccdc9c3eSSadaf Ebrahimi }
1483*ccdc9c3eSSadaf Ebrahimi 
ASCIIMatchRE2(int n)1484*ccdc9c3eSSadaf Ebrahimi void ASCIIMatchRE2(int n) {
1485*ccdc9c3eSSadaf Ebrahimi   StringPiece a;
1486*ccdc9c3eSSadaf Ebrahimi   RE2 re("(?-s)^([ -~]+)");
1487*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < n; i++) {
1488*ccdc9c3eSSadaf Ebrahimi     RE2::PartialMatch(http_text, re, &a);
1489*ccdc9c3eSSadaf Ebrahimi   }
1490*ccdc9c3eSSadaf Ebrahimi }
1491*ccdc9c3eSSadaf Ebrahimi 
1492*ccdc9c3eSSadaf Ebrahimi #ifdef USEPCRE
1493*ccdc9c3eSSadaf Ebrahimi BENCHMARK(ASCIIMatchPCRE)->ThreadRange(1, NumCPUs());
1494*ccdc9c3eSSadaf Ebrahimi #endif
1495*ccdc9c3eSSadaf Ebrahimi BENCHMARK(ASCIIMatchRE2)->ThreadRange(1, NumCPUs());
1496*ccdc9c3eSSadaf Ebrahimi 
FullMatchPCRE(int iter,int n,const char * regexp)1497*ccdc9c3eSSadaf Ebrahimi void FullMatchPCRE(int iter, int n, const char *regexp) {
1498*ccdc9c3eSSadaf Ebrahimi   StopBenchmarkTiming();
1499*ccdc9c3eSSadaf Ebrahimi   string s;
1500*ccdc9c3eSSadaf Ebrahimi   MakeText(&s, n);
1501*ccdc9c3eSSadaf Ebrahimi   s += "ABCDEFGHIJ";
1502*ccdc9c3eSSadaf Ebrahimi   BenchmarkMemoryUsage();
1503*ccdc9c3eSSadaf Ebrahimi   PCRE re(regexp);
1504*ccdc9c3eSSadaf Ebrahimi   StartBenchmarkTiming();
1505*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iter; i++)
1506*ccdc9c3eSSadaf Ebrahimi     CHECK(PCRE::FullMatch(s, re));
1507*ccdc9c3eSSadaf Ebrahimi   SetBenchmarkBytesProcessed(static_cast<int64_t>(iter)*n);
1508*ccdc9c3eSSadaf Ebrahimi }
1509*ccdc9c3eSSadaf Ebrahimi 
FullMatchRE2(int iter,int n,const char * regexp)1510*ccdc9c3eSSadaf Ebrahimi void FullMatchRE2(int iter, int n, const char *regexp) {
1511*ccdc9c3eSSadaf Ebrahimi   StopBenchmarkTiming();
1512*ccdc9c3eSSadaf Ebrahimi   string s;
1513*ccdc9c3eSSadaf Ebrahimi   MakeText(&s, n);
1514*ccdc9c3eSSadaf Ebrahimi   s += "ABCDEFGHIJ";
1515*ccdc9c3eSSadaf Ebrahimi   BenchmarkMemoryUsage();
1516*ccdc9c3eSSadaf Ebrahimi   RE2 re(regexp, RE2::Latin1);
1517*ccdc9c3eSSadaf Ebrahimi   StartBenchmarkTiming();
1518*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iter; i++)
1519*ccdc9c3eSSadaf Ebrahimi     CHECK(RE2::FullMatch(s, re));
1520*ccdc9c3eSSadaf Ebrahimi   SetBenchmarkBytesProcessed(static_cast<int64_t>(iter)*n);
1521*ccdc9c3eSSadaf Ebrahimi }
1522*ccdc9c3eSSadaf Ebrahimi 
FullMatch_DotStar_CachedPCRE(int i,int n)1523*ccdc9c3eSSadaf Ebrahimi void FullMatch_DotStar_CachedPCRE(int i, int n) { FullMatchPCRE(i, n, "(?s).*"); }
FullMatch_DotStar_CachedRE2(int i,int n)1524*ccdc9c3eSSadaf Ebrahimi void FullMatch_DotStar_CachedRE2(int i, int n)  { FullMatchRE2(i, n, "(?s).*"); }
1525*ccdc9c3eSSadaf Ebrahimi 
FullMatch_DotStarDollar_CachedPCRE(int i,int n)1526*ccdc9c3eSSadaf Ebrahimi void FullMatch_DotStarDollar_CachedPCRE(int i, int n) { FullMatchPCRE(i, n, "(?s).*$"); }
FullMatch_DotStarDollar_CachedRE2(int i,int n)1527*ccdc9c3eSSadaf Ebrahimi void FullMatch_DotStarDollar_CachedRE2(int i, int n)  { FullMatchRE2(i, n, "(?s).*$"); }
1528*ccdc9c3eSSadaf Ebrahimi 
FullMatch_DotStarCapture_CachedPCRE(int i,int n)1529*ccdc9c3eSSadaf Ebrahimi void FullMatch_DotStarCapture_CachedPCRE(int i, int n) { FullMatchPCRE(i, n, "(?s)((.*)()()($))"); }
FullMatch_DotStarCapture_CachedRE2(int i,int n)1530*ccdc9c3eSSadaf Ebrahimi void FullMatch_DotStarCapture_CachedRE2(int i, int n)  { FullMatchRE2(i, n, "(?s)((.*)()()($))"); }
1531*ccdc9c3eSSadaf Ebrahimi 
1532*ccdc9c3eSSadaf Ebrahimi #ifdef USEPCRE
1533*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(FullMatch_DotStar_CachedPCRE, 8, 2<<20);
1534*ccdc9c3eSSadaf Ebrahimi #endif
1535*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(FullMatch_DotStar_CachedRE2,  8, 2<<20);
1536*ccdc9c3eSSadaf Ebrahimi 
1537*ccdc9c3eSSadaf Ebrahimi #ifdef USEPCRE
1538*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(FullMatch_DotStarDollar_CachedPCRE, 8, 2<<20);
1539*ccdc9c3eSSadaf Ebrahimi #endif
1540*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(FullMatch_DotStarDollar_CachedRE2,  8, 2<<20);
1541*ccdc9c3eSSadaf Ebrahimi 
1542*ccdc9c3eSSadaf Ebrahimi #ifdef USEPCRE
1543*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(FullMatch_DotStarCapture_CachedPCRE, 8, 2<<20);
1544*ccdc9c3eSSadaf Ebrahimi #endif
1545*ccdc9c3eSSadaf Ebrahimi BENCHMARK_RANGE(FullMatch_DotStarCapture_CachedRE2,  8, 2<<20);
1546*ccdc9c3eSSadaf Ebrahimi 
PossibleMatchRangeCommon(int iter,const char * regexp)1547*ccdc9c3eSSadaf Ebrahimi void PossibleMatchRangeCommon(int iter, const char* regexp) {
1548*ccdc9c3eSSadaf Ebrahimi   StopBenchmarkTiming();
1549*ccdc9c3eSSadaf Ebrahimi   RE2 re(regexp);
1550*ccdc9c3eSSadaf Ebrahimi   StartBenchmarkTiming();
1551*ccdc9c3eSSadaf Ebrahimi   string min;
1552*ccdc9c3eSSadaf Ebrahimi   string max;
1553*ccdc9c3eSSadaf Ebrahimi   const int kMaxLen = 16;
1554*ccdc9c3eSSadaf Ebrahimi   for (int i = 0; i < iter; i++) {
1555*ccdc9c3eSSadaf Ebrahimi     CHECK(re.PossibleMatchRange(&min, &max, kMaxLen));
1556*ccdc9c3eSSadaf Ebrahimi   }
1557*ccdc9c3eSSadaf Ebrahimi }
1558*ccdc9c3eSSadaf Ebrahimi 
PossibleMatchRange_Trivial(int i)1559*ccdc9c3eSSadaf Ebrahimi void PossibleMatchRange_Trivial(int i) {
1560*ccdc9c3eSSadaf Ebrahimi   PossibleMatchRangeCommon(i, ".*");
1561*ccdc9c3eSSadaf Ebrahimi }
PossibleMatchRange_Complex(int i)1562*ccdc9c3eSSadaf Ebrahimi void PossibleMatchRange_Complex(int i) {
1563*ccdc9c3eSSadaf Ebrahimi   PossibleMatchRangeCommon(i, "^abc[def]?[gh]{1,2}.*");
1564*ccdc9c3eSSadaf Ebrahimi }
PossibleMatchRange_Prefix(int i)1565*ccdc9c3eSSadaf Ebrahimi void PossibleMatchRange_Prefix(int i) {
1566*ccdc9c3eSSadaf Ebrahimi   PossibleMatchRangeCommon(i, "^some_random_prefix.*");
1567*ccdc9c3eSSadaf Ebrahimi }
PossibleMatchRange_NoProg(int i)1568*ccdc9c3eSSadaf Ebrahimi void PossibleMatchRange_NoProg(int i) {
1569*ccdc9c3eSSadaf Ebrahimi   PossibleMatchRangeCommon(i, "^some_random_string$");
1570*ccdc9c3eSSadaf Ebrahimi }
1571*ccdc9c3eSSadaf Ebrahimi 
1572*ccdc9c3eSSadaf Ebrahimi BENCHMARK(PossibleMatchRange_Trivial);
1573*ccdc9c3eSSadaf Ebrahimi BENCHMARK(PossibleMatchRange_Complex);
1574*ccdc9c3eSSadaf Ebrahimi BENCHMARK(PossibleMatchRange_Prefix);
1575*ccdc9c3eSSadaf Ebrahimi BENCHMARK(PossibleMatchRange_NoProg);
1576*ccdc9c3eSSadaf Ebrahimi 
1577*ccdc9c3eSSadaf Ebrahimi }  // namespace re2
1578