10d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// Copyright 2006-2008 The RE2 Authors. All Rights Reserved. 20d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// Use of this source code is governed by a BSD-style 30d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// license that can be found in the LICENSE file. 40d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 50d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// Benchmarks for regular expression implementations. 60d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 70d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#include "util/test.h" 80d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#include "re2/prog.h" 90d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#include "re2/re2.h" 100d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#include "re2/regexp.h" 110d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#include "util/pcre.h" 120d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#include "util/benchmark.h" 130d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 140d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinnamespace re2 { 150d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Test(); 160d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid MemoryUsage(); 170d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} // namespace re2 180d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 190d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkintypedef testing::MallocCounter MallocCounter; 200d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 210d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinnamespace re2 { 220d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 230d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Test() { 240d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Regexp* re = Regexp::Parse("(\\d+)-(\\d+)-(\\d+)", Regexp::LikePerl, NULL); 250d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(re); 260d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog* prog = re->CompileToProg(0); 270d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog); 280d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog->IsOnePass()); 290d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin const char* text = "650-253-0001"; 300d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece sp[4]; 310d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog->SearchOnePass(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 4)); 320d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(sp[0], "650-253-0001"); 330d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(sp[1], "650"); 340d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(sp[2], "253"); 350d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(sp[3], "0001"); 360d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin delete prog; 370d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin re->Decref(); 380d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin LOG(INFO) << "test passed\n"; 390d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 400d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 410d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid MemoryUsage() { 420d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin const char* regexp = "(\\d+)-(\\d+)-(\\d+)"; 430d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin const char* text = "650-253-0001"; 440d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin { 450d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin MallocCounter mc(MallocCounter::THIS_THREAD_ONLY); 460d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); 470d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(re); 480d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin // Can't pass mc.HeapGrowth() and mc.PeakHeapGrowth() to LOG(INFO) directly, 490d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin // because LOG(INFO) might do a big allocation before they get evaluated. 500d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin fprintf(stderr, "Regexp: %7lld bytes (peak=%lld)\n", mc.HeapGrowth(), mc.PeakHeapGrowth()); 510d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin mc.Reset(); 520d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 530d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog* prog = re->CompileToProg(0); 540d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog); 550d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog->IsOnePass()); 560d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin fprintf(stderr, "Prog: %7lld bytes (peak=%lld)\n", mc.HeapGrowth(), mc.PeakHeapGrowth()); 570d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin mc.Reset(); 580d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 590d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece sp[4]; 600d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog->SearchOnePass(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 4)); 610d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin fprintf(stderr, "Search: %7lld bytes (peak=%lld)\n", mc.HeapGrowth(), mc.PeakHeapGrowth()); 620d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin delete prog; 630d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin re->Decref(); 640d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 650d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 660d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin { 670d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin MallocCounter mc(MallocCounter::THIS_THREAD_ONLY); 680d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 690d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin PCRE re(regexp, PCRE::UTF8); 700d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin fprintf(stderr, "RE: %7lld bytes (peak=%lld)\n", mc.HeapGrowth(), mc.PeakHeapGrowth()); 710d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin PCRE::FullMatch(text, re); 720d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin fprintf(stderr, "RE: %7lld bytes (peak=%lld)\n", mc.HeapGrowth(), mc.PeakHeapGrowth()); 730d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 740d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 750d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin { 760d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin MallocCounter mc(MallocCounter::THIS_THREAD_ONLY); 770d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 780d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin PCRE* re = new PCRE(regexp, PCRE::UTF8); 790d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin fprintf(stderr, "PCRE*: %7lld bytes (peak=%lld)\n", mc.HeapGrowth(), mc.PeakHeapGrowth()); 800d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin PCRE::FullMatch(text, *re); 810d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin fprintf(stderr, "PCRE*: %7lld bytes (peak=%lld)\n", mc.HeapGrowth(), mc.PeakHeapGrowth()); 820d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin delete re; 830d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 840d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 850d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin { 860d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin MallocCounter mc(MallocCounter::THIS_THREAD_ONLY); 870d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 880d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin RE2 re(regexp); 890d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin fprintf(stderr, "RE2: %7lld bytes (peak=%lld)\n", mc.HeapGrowth(), mc.PeakHeapGrowth()); 900d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin RE2::FullMatch(text, re); 910d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin fprintf(stderr, "RE2: %7lld bytes (peak=%lld)\n", mc.HeapGrowth(), mc.PeakHeapGrowth()); 920d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 930d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 940d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin fprintf(stderr, "sizeof: PCRE=%d RE2=%d Prog=%d Inst=%d\n", 950d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin static_cast<int>(sizeof(PCRE)), 960d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin static_cast<int>(sizeof(RE2)), 970d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin static_cast<int>(sizeof(Prog)), 980d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin static_cast<int>(sizeof(Prog::Inst))); 990d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 1000d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 1010d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// Regular expression implementation wrappers. 1020d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// Defined at bottom of file, but they are repetitive 1030d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// and not interesting. 1040d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 1050d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkintypedef void SearchImpl(int iters, const char* regexp, const StringPiece& text, 1060d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog::Anchor anchor, bool expect_match); 1070d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 1080d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinSearchImpl SearchDFA, SearchNFA, SearchOnePass, SearchBitState, 1090d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin SearchPCRE, SearchRE2, 1100d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin SearchCachedDFA, SearchCachedNFA, SearchCachedOnePass, SearchCachedBitState, 1110d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin SearchCachedPCRE, SearchCachedRE2; 1120d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 1130d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkintypedef void ParseImpl(int iters, const char* regexp, const StringPiece& text); 1140d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 1150d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinParseImpl Parse1NFA, Parse1OnePass, Parse1BitState, 1160d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Parse1PCRE, Parse1RE2, 1170d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Parse1Backtrack, 1180d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Parse1CachedNFA, Parse1CachedOnePass, Parse1CachedBitState, 1190d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Parse1CachedPCRE, Parse1CachedRE2, 1200d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Parse1CachedBacktrack; 1210d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 1220d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinParseImpl Parse3NFA, Parse3OnePass, Parse3BitState, 1230d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Parse3PCRE, Parse3RE2, 1240d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Parse3Backtrack, 1250d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Parse3CachedNFA, Parse3CachedOnePass, Parse3CachedBitState, 1260d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Parse3CachedPCRE, Parse3CachedRE2, 1270d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Parse3CachedBacktrack; 1280d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 1290d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinParseImpl SearchParse2CachedPCRE, SearchParse2CachedRE2; 1300d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 1310d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinParseImpl SearchParse1CachedPCRE, SearchParse1CachedRE2; 1320d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 1330d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// Benchmark: failed search for regexp in random text. 1340d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 1350d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// Generate random text that won't contain the search string, 1360d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// to test worst-case search behavior. 1370d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid MakeText(string* text, int nbytes) { 1380d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin text->resize(nbytes); 1390d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin srand(0); 1400d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < nbytes; i++) { 1410d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin if (!rand()%30) 1420d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin (*text)[i] = '\n'; 1430d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin else 1440d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin (*text)[i] = rand()%(0x7E + 1 - 0x20)+0x20; 1450d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 1460d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 1470d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 1480d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// Makes text of size nbytes, then calls run to search 1490d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// the text for regexp iters times. 1500d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search(int iters, int nbytes, const char* regexp, SearchImpl* search) { 1510d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StopBenchmarkTiming(); 1520d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin string s; 1530d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin MakeText(&s, nbytes); 1540d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin BenchmarkMemoryUsage(); 1550d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StartBenchmarkTiming(); 1560d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin search(iters, regexp, s, Prog::kUnanchored, false); 1570d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin SetBenchmarkBytesProcessed(static_cast<int64>(iters)*nbytes); 1580d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 1590d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 1600d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// These two are easy because they start with an A, 1610d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// giving the search loop something to memchr for. 1620d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#define EASY0 "ABCDEFGHIJKLMNOPQRSTUVWXYZ$" 1630d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#define EASY1 "A[AB]B[BC]C[CD]D[DE]E[EF]F[FG]G[GH]H[HI]I[IJ]J$" 1640d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 1650d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// This is a little harder, since it starts with a character class 1660d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// and thus can't be memchr'ed. Could look for ABC and work backward, 1670d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// but no one does that. 1680d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#define MEDIUM "[XYZ]ABCDEFGHIJKLMNOPQRSTUVWXYZ$" 1690d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 1700d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// This is a fair amount harder, because of the leading [ -~]*. 1710d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// A bad backtracking implementation will take O(text^2) time to 1720d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// figure out there's no match. 1730d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#define HARD "[ -~]*ABCDEFGHIJKLMNOPQRSTUVWXYZ$" 1740d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 1750d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// This stresses engines that are trying to track parentheses. 1760d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#define PARENS "([ -~])*(A)(B)(C)(D)(E)(F)(G)(H)(I)(J)(K)(L)(M)" \ 1770d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin "(N)(O)(P)(Q)(R)(S)(T)(U)(V)(W)(X)(Y)(Z)$" 1780d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 1790d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Easy0_CachedDFA(int i, int n) { Search(i, n, EASY0, SearchCachedDFA); } 1800d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Easy0_CachedNFA(int i, int n) { Search(i, n, EASY0, SearchCachedNFA); } 1810d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Easy0_CachedPCRE(int i, int n) { Search(i, n, EASY0, SearchCachedPCRE); } 1820d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Easy0_CachedRE2(int i, int n) { Search(i, n, EASY0, SearchCachedRE2); } 1830d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 1840d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_Easy0_CachedDFA, 8, 16<<20)->ThreadRange(1, NumCPUs()); 1850d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_Easy0_CachedNFA, 8, 256<<10)->ThreadRange(1, NumCPUs()); 1860d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#ifdef USEPCRE 1870d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_Easy0_CachedPCRE, 8, 16<<20)->ThreadRange(1, NumCPUs()); 1880d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#endif 1890d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_Easy0_CachedRE2, 8, 16<<20)->ThreadRange(1, NumCPUs()); 1900d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 1910d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Easy1_CachedDFA(int i, int n) { Search(i, n, EASY1, SearchCachedDFA); } 1920d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Easy1_CachedNFA(int i, int n) { Search(i, n, EASY1, SearchCachedNFA); } 1930d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Easy1_CachedPCRE(int i, int n) { Search(i, n, EASY1, SearchCachedPCRE); } 1940d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Easy1_CachedRE2(int i, int n) { Search(i, n, EASY1, SearchCachedRE2); } 1950d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 1960d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_Easy1_CachedDFA, 8, 16<<20)->ThreadRange(1, NumCPUs()); 1970d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_Easy1_CachedNFA, 8, 256<<10)->ThreadRange(1, NumCPUs()); 1980d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#ifdef USEPCRE 1990d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_Easy1_CachedPCRE, 8, 16<<20)->ThreadRange(1, NumCPUs()); 2000d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#endif 2010d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_Easy1_CachedRE2, 8, 16<<20)->ThreadRange(1, NumCPUs()); 2020d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 2030d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Medium_CachedDFA(int i, int n) { Search(i, n, MEDIUM, SearchCachedDFA); } 2040d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Medium_CachedNFA(int i, int n) { Search(i, n, MEDIUM, SearchCachedNFA); } 2050d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Medium_CachedPCRE(int i, int n) { Search(i, n, MEDIUM, SearchCachedPCRE); } 2060d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Medium_CachedRE2(int i, int n) { Search(i, n, MEDIUM, SearchCachedRE2); } 2070d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 2080d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_Medium_CachedDFA, 8, 16<<20)->ThreadRange(1, NumCPUs()); 2090d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_Medium_CachedNFA, 8, 256<<10)->ThreadRange(1, NumCPUs()); 2100d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#ifdef USEPCRE 2110d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_Medium_CachedPCRE, 8, 256<<10)->ThreadRange(1, NumCPUs()); 2120d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#endif 2130d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_Medium_CachedRE2, 8, 16<<20)->ThreadRange(1, NumCPUs()); 2140d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 2150d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Hard_CachedDFA(int i, int n) { Search(i, n, HARD, SearchCachedDFA); } 2160d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Hard_CachedNFA(int i, int n) { Search(i, n, HARD, SearchCachedNFA); } 2170d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Hard_CachedPCRE(int i, int n) { Search(i, n, HARD, SearchCachedPCRE); } 2180d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Hard_CachedRE2(int i, int n) { Search(i, n, HARD, SearchCachedRE2); } 2190d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 2200d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_Hard_CachedDFA, 8, 16<<20)->ThreadRange(1, NumCPUs()); 2210d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_Hard_CachedNFA, 8, 256<<10)->ThreadRange(1, NumCPUs()); 2220d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#ifdef USEPCRE 2230d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_Hard_CachedPCRE, 8, 4<<10)->ThreadRange(1, NumCPUs()); 2240d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#endif 2250d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_Hard_CachedRE2, 8, 16<<20)->ThreadRange(1, NumCPUs()); 2260d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 2270d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Parens_CachedDFA(int i, int n) { Search(i, n, PARENS, SearchCachedDFA); } 2280d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Parens_CachedNFA(int i, int n) { Search(i, n, PARENS, SearchCachedNFA); } 2290d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Parens_CachedPCRE(int i, int n) { Search(i, n, PARENS, SearchCachedPCRE); } 2300d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Parens_CachedRE2(int i, int n) { Search(i, n, PARENS, SearchCachedRE2); } 2310d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 2320d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_Parens_CachedDFA, 8, 16<<20)->ThreadRange(1, NumCPUs()); 2330d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_Parens_CachedNFA, 8, 256<<10)->ThreadRange(1, NumCPUs()); 2340d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#ifdef USEPCRE 2350d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_Parens_CachedPCRE, 8, 8)->ThreadRange(1, NumCPUs()); 2360d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#endif 2370d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_Parens_CachedRE2, 8, 16<<20)->ThreadRange(1, NumCPUs()); 2380d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 2390d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid SearchBigFixed(int iters, int nbytes, SearchImpl* search) { 2400d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StopBenchmarkTiming(); 2410d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin string s; 2420d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin s.append(nbytes/2, 'x'); 2430d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin string regexp = "^" + s + ".*$"; 2440d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin string t; 2450d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin MakeText(&t, nbytes/2); 2460d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin s += t; 2470d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin BenchmarkMemoryUsage(); 2480d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StartBenchmarkTiming(); 2490d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin search(iters, regexp.c_str(), s, Prog::kUnanchored, true); 2500d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin SetBenchmarkBytesProcessed(static_cast<int64>(iters)*nbytes); 2510d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 2520d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 2530d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_BigFixed_CachedDFA(int i, int n) { SearchBigFixed(i, n, SearchCachedDFA); } 2540d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_BigFixed_CachedNFA(int i, int n) { SearchBigFixed(i, n, SearchCachedNFA); } 2550d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_BigFixed_CachedPCRE(int i, int n) { SearchBigFixed(i, n, SearchCachedPCRE); } 2560d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_BigFixed_CachedRE2(int i, int n) { SearchBigFixed(i, n, SearchCachedRE2); } 2570d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 2580d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_BigFixed_CachedDFA, 8, 1<<20)->ThreadRange(1, NumCPUs()); 2590d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_BigFixed_CachedNFA, 8, 32<<10)->ThreadRange(1, NumCPUs()); 2600d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#ifdef USEPCRE 2610d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_BigFixed_CachedPCRE, 8, 32<<10)->ThreadRange(1, NumCPUs()); 2620d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#endif 2630d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_BigFixed_CachedRE2, 8, 1<<20)->ThreadRange(1, NumCPUs()); 2640d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 2650d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// Benchmark: FindAndConsume 2660d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid FindAndConsume(int iters, int nbytes) { 2670d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StopBenchmarkTiming(); 2680d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin string s; 2690d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin MakeText(&s, nbytes); 2700d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin s.append("Hello World"); 2710d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StartBenchmarkTiming(); 2720d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin RE2 re("((Hello World))"); 2730d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 2740d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece t = s; 2750d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece u; 2760d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(RE2::FindAndConsume(&t, re, &u)); 2770d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(u, "Hello World"); 2780d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 2790d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin SetBenchmarkBytesProcessed(static_cast<int64>(iters)*nbytes); 2800d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 2810d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 2820d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(FindAndConsume, 8, 16<<20)->ThreadRange(1, NumCPUs()); 2830d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 2840d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// Benchmark: successful anchored search. 2850d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 2860d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid SearchSuccess(int iters, int nbytes, const char* regexp, SearchImpl* search) { 2870d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin string s; 2880d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin MakeText(&s, nbytes); 2890d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin BenchmarkMemoryUsage(); 2900d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin search(iters, regexp, s, Prog::kAnchored, true); 2910d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin SetBenchmarkBytesProcessed(static_cast<int64>(iters)*nbytes); 2920d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 2930d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 2940d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// Unambiguous search (RE2 can use OnePass). 2950d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 2960d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Success_DFA(int i, int n) { SearchSuccess(i, n, ".*$", SearchDFA); } 2970d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Success_OnePass(int i, int n) { SearchSuccess(i, n, ".*$", SearchOnePass); } 2980d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Success_PCRE(int i, int n) { SearchSuccess(i, n, ".*$", SearchPCRE); } 2990d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Success_RE2(int i, int n) { SearchSuccess(i, n, ".*$", SearchRE2); } 3000d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 3010d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_Success_DFA, 8, 16<<20)->ThreadRange(1, NumCPUs()); 3020d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#ifdef USEPCRE 3030d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_Success_PCRE, 8, 16<<20)->ThreadRange(1, NumCPUs()); 3040d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#endif 3050d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_Success_RE2, 8, 16<<20)->ThreadRange(1, NumCPUs()); 3060d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_Success_OnePass, 8, 2<<20)->ThreadRange(1, NumCPUs()); 3070d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 3080d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Success_CachedDFA(int i, int n) { SearchSuccess(i, n, ".*$", SearchCachedDFA); } 3090d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Success_CachedOnePass(int i, int n) { SearchSuccess(i, n, ".*$", SearchCachedOnePass); } 3100d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Success_CachedPCRE(int i, int n) { SearchSuccess(i, n, ".*$", SearchCachedPCRE); } 3110d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Success_CachedRE2(int i, int n) { SearchSuccess(i, n, ".*$", SearchCachedRE2); } 3120d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 3130d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_Success_CachedDFA, 8, 16<<20)->ThreadRange(1, NumCPUs()); 3140d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#ifdef USEPCRE 3150d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_Success_CachedPCRE, 8, 16<<20)->ThreadRange(1, NumCPUs()); 3160d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#endif 3170d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_Success_CachedRE2, 8, 16<<20)->ThreadRange(1, NumCPUs()); 3180d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_Success_CachedOnePass, 8, 2<<20)->ThreadRange(1, NumCPUs()); 3190d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 3200d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// Ambiguous search (RE2 cannot use OnePass). 3210d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 3220d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Success1_DFA(int i, int n) { SearchSuccess(i, n, ".*.$", SearchDFA); } 3230d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Success1_PCRE(int i, int n) { SearchSuccess(i, n, ".*.$", SearchPCRE); } 3240d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Success1_RE2(int i, int n) { SearchSuccess(i, n, ".*.$", SearchRE2); } 3250d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Success1_BitState(int i, int n) { SearchSuccess(i, n, ".*.$", SearchBitState); } 3260d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 3270d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_Success1_DFA, 8, 16<<20)->ThreadRange(1, NumCPUs()); 3280d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#ifdef USEPCRE 3290d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_Success1_PCRE, 8, 16<<20)->ThreadRange(1, NumCPUs()); 3300d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#endif 3310d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_Success1_RE2, 8, 16<<20)->ThreadRange(1, NumCPUs()); 3320d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_Success1_BitState, 8, 2<<20)->ThreadRange(1, NumCPUs()); 3330d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 3340d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Success1_Cached_DFA(int i, int n) { SearchSuccess(i, n, ".*.$", SearchCachedDFA); } 3350d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Success1_Cached_PCRE(int i, int n) { SearchSuccess(i, n, ".*.$", SearchCachedPCRE); } 3360d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Success1_Cached_RE2(int i, int n) { SearchSuccess(i, n, ".*.$", SearchCachedRE2); } 3370d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 3380d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_Success1_Cached_DFA, 8, 16<<20)->ThreadRange(1, NumCPUs()); 3390d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#ifdef USEPCRE 3400d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_Success1_Cached_PCRE, 8, 16<<20)->ThreadRange(1, NumCPUs()); 3410d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#endif 3420d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(Search_Success1_Cached_RE2, 8, 16<<20)->ThreadRange(1, NumCPUs()); 3430d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 3440d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// Benchmark: use regexp to find phone number. 3450d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 3460d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid SearchDigits(int iters, SearchImpl* search) { 3470d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin const char *text = "650-253-0001"; 3480d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin int len = strlen(text); 3490d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin BenchmarkMemoryUsage(); 3500d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin search(iters, "([0-9]+)-([0-9]+)-([0-9]+)", 3510d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece(text, len), Prog::kAnchored, true); 3520d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin SetBenchmarkItemsProcessed(iters); 3530d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 3540d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 3550d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Digits_DFA(int i) { SearchDigits(i, SearchDFA); } 3560d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Digits_NFA(int i) { SearchDigits(i, SearchNFA); } 3570d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Digits_OnePass(int i) { SearchDigits(i, SearchOnePass); } 3580d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Digits_PCRE(int i) { SearchDigits(i, SearchPCRE); } 3590d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Digits_RE2(int i) { SearchDigits(i, SearchRE2); } 3600d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Search_Digits_BitState(int i) { SearchDigits(i, SearchBitState); } 3610d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 3620d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Search_Digits_DFA)->ThreadRange(1, NumCPUs()); 3630d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Search_Digits_NFA)->ThreadRange(1, NumCPUs()); 3640d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Search_Digits_OnePass)->ThreadRange(1, NumCPUs()); 3650d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#ifdef USEPCRE 3660d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Search_Digits_PCRE)->ThreadRange(1, NumCPUs()); 3670d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#endif 3680d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Search_Digits_RE2)->ThreadRange(1, NumCPUs()); 3690d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Search_Digits_BitState)->ThreadRange(1, NumCPUs()); 3700d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 3710d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// Benchmark: use regexp to parse digit fields in phone number. 3720d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 3730d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse3Digits(int iters, 3740d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin void (*parse3)(int, const char*, const StringPiece&)) { 3750d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin BenchmarkMemoryUsage(); 3760d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin parse3(iters, "([0-9]+)-([0-9]+)-([0-9]+)", "650-253-0001"); 3770d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin SetBenchmarkItemsProcessed(iters); 3780d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 3790d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 3800d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_Digits_NFA(int i) { Parse3Digits(i, Parse3NFA); } 3810d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_Digits_OnePass(int i) { Parse3Digits(i, Parse3OnePass); } 3820d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_Digits_PCRE(int i) { Parse3Digits(i, Parse3PCRE); } 3830d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_Digits_RE2(int i) { Parse3Digits(i, Parse3RE2); } 3840d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_Digits_Backtrack(int i) { Parse3Digits(i, Parse3Backtrack); } 3850d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_Digits_BitState(int i) { Parse3Digits(i, Parse3BitState); } 3860d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 3870d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_Digits_NFA)->ThreadRange(1, NumCPUs()); 3880d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_Digits_OnePass)->ThreadRange(1, NumCPUs()); 3890d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#ifdef USEPCRE 3900d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_Digits_PCRE)->ThreadRange(1, NumCPUs()); 3910d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#endif 3920d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_Digits_RE2)->ThreadRange(1, NumCPUs()); 3930d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_Digits_Backtrack)->ThreadRange(1, NumCPUs()); 3940d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_Digits_BitState)->ThreadRange(1, NumCPUs()); 3950d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 3960d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_CachedDigits_NFA(int i) { Parse3Digits(i, Parse3CachedNFA); } 3970d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_CachedDigits_OnePass(int i) { Parse3Digits(i, Parse3CachedOnePass); } 3980d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_CachedDigits_PCRE(int i) { Parse3Digits(i, Parse3CachedPCRE); } 3990d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_CachedDigits_RE2(int i) { Parse3Digits(i, Parse3CachedRE2); } 4000d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_CachedDigits_Backtrack(int i) { Parse3Digits(i, Parse3CachedBacktrack); } 4010d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_CachedDigits_BitState(int i) { Parse3Digits(i, Parse3CachedBitState); } 4020d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 4030d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_CachedDigits_NFA)->ThreadRange(1, NumCPUs()); 4040d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_CachedDigits_OnePass)->ThreadRange(1, NumCPUs()); 4050d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#ifdef USEPCRE 4060d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_CachedDigits_PCRE)->ThreadRange(1, NumCPUs()); 4070d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#endif 4080d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_CachedDigits_Backtrack)->ThreadRange(1, NumCPUs()); 4090d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_CachedDigits_RE2)->ThreadRange(1, NumCPUs()); 4100d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_CachedDigits_BitState)->ThreadRange(1, NumCPUs()); 4110d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 4120d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse3DigitDs(int iters, 4130d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin void (*parse3)(int, const char*, const StringPiece&)) { 4140d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin BenchmarkMemoryUsage(); 4150d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin parse3(iters, "(\\d+)-(\\d+)-(\\d+)", "650-253-0001"); 4160d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin SetBenchmarkItemsProcessed(iters); 4170d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 4180d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 4190d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_DigitDs_NFA(int i) { Parse3DigitDs(i, Parse3NFA); } 4200d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_DigitDs_OnePass(int i) { Parse3DigitDs(i, Parse3OnePass); } 4210d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_DigitDs_PCRE(int i) { Parse3DigitDs(i, Parse3PCRE); } 4220d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_DigitDs_RE2(int i) { Parse3DigitDs(i, Parse3RE2); } 4230d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_DigitDs_Backtrack(int i) { Parse3DigitDs(i, Parse3CachedBacktrack); } 4240d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_DigitDs_BitState(int i) { Parse3DigitDs(i, Parse3CachedBitState); } 4250d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 4260d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_DigitDs_NFA)->ThreadRange(1, NumCPUs()); 4270d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_DigitDs_OnePass)->ThreadRange(1, NumCPUs()); 4280d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#ifdef USEPCRE 4290d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_DigitDs_PCRE)->ThreadRange(1, NumCPUs()); 4300d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#endif 4310d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_DigitDs_RE2)->ThreadRange(1, NumCPUs()); 4320d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_DigitDs_Backtrack)->ThreadRange(1, NumCPUs()); 4330d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_DigitDs_BitState)->ThreadRange(1, NumCPUs()); 4340d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 4350d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_CachedDigitDs_NFA(int i) { Parse3DigitDs(i, Parse3CachedNFA); } 4360d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_CachedDigitDs_OnePass(int i) { Parse3DigitDs(i, Parse3CachedOnePass); } 4370d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_CachedDigitDs_PCRE(int i) { Parse3DigitDs(i, Parse3CachedPCRE); } 4380d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_CachedDigitDs_RE2(int i) { Parse3DigitDs(i, Parse3CachedRE2); } 4390d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_CachedDigitDs_Backtrack(int i) { Parse3DigitDs(i, Parse3CachedBacktrack); } 4400d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_CachedDigitDs_BitState(int i) { Parse3DigitDs(i, Parse3CachedBitState); } 4410d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 4420d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_CachedDigitDs_NFA)->ThreadRange(1, NumCPUs()); 4430d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_CachedDigitDs_OnePass)->ThreadRange(1, NumCPUs()); 4440d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#ifdef USEPCRE 4450d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_CachedDigitDs_PCRE)->ThreadRange(1, NumCPUs()); 4460d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#endif 4470d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_CachedDigitDs_Backtrack)->ThreadRange(1, NumCPUs()); 4480d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_CachedDigitDs_RE2)->ThreadRange(1, NumCPUs()); 4490d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_CachedDigitDs_BitState)->ThreadRange(1, NumCPUs()); 4500d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 4510d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// Benchmark: splitting off leading number field. 4520d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 4530d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse1Split(int iters, 4540d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin void (*parse1)(int, const char*, const StringPiece&)) { 4550d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin BenchmarkMemoryUsage(); 4560d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin parse1(iters, "[0-9]+-(.*)", "650-253-0001"); 4570d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin SetBenchmarkItemsProcessed(iters); 4580d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 4590d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 4600d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_Split_NFA(int i) { Parse1Split(i, Parse1NFA); } 4610d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_Split_OnePass(int i) { Parse1Split(i, Parse1OnePass); } 4620d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_Split_PCRE(int i) { Parse1Split(i, Parse1PCRE); } 4630d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_Split_RE2(int i) { Parse1Split(i, Parse1RE2); } 4640d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_Split_BitState(int i) { Parse1Split(i, Parse1BitState); } 4650d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 4660d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_Split_NFA)->ThreadRange(1, NumCPUs()); 4670d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_Split_OnePass)->ThreadRange(1, NumCPUs()); 4680d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#ifdef USEPCRE 4690d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_Split_PCRE)->ThreadRange(1, NumCPUs()); 4700d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#endif 4710d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_Split_RE2)->ThreadRange(1, NumCPUs()); 4720d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_Split_BitState)->ThreadRange(1, NumCPUs()); 4730d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 4740d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_CachedSplit_NFA(int i) { Parse1Split(i, Parse1CachedNFA); } 4750d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_CachedSplit_OnePass(int i) { Parse1Split(i, Parse1CachedOnePass); } 4760d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_CachedSplit_PCRE(int i) { Parse1Split(i, Parse1CachedPCRE); } 4770d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_CachedSplit_RE2(int i) { Parse1Split(i, Parse1CachedRE2); } 4780d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_CachedSplit_BitState(int i) { Parse1Split(i, Parse1CachedBitState); } 4790d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 4800d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_CachedSplit_NFA)->ThreadRange(1, NumCPUs()); 4810d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_CachedSplit_OnePass)->ThreadRange(1, NumCPUs()); 4820d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#ifdef USEPCRE 4830d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_CachedSplit_PCRE)->ThreadRange(1, NumCPUs()); 4840d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#endif 4850d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_CachedSplit_RE2)->ThreadRange(1, NumCPUs()); 4860d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_CachedSplit_BitState)->ThreadRange(1, NumCPUs()); 4870d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 4880d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// Benchmark: splitting off leading number field but harder (ambiguous regexp). 4890d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 4900d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse1SplitHard(int iters, 4910d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin void (*run)(int, const char*, const StringPiece&)) { 4920d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin BenchmarkMemoryUsage(); 4930d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin run(iters, "[0-9]+.(.*)", "650-253-0001"); 4940d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin SetBenchmarkItemsProcessed(iters); 4950d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 4960d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 4970d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_SplitHard_NFA(int i) { Parse1SplitHard(i, Parse1NFA); } 4980d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_SplitHard_PCRE(int i) { Parse1SplitHard(i, Parse1PCRE); } 4990d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_SplitHard_RE2(int i) { Parse1SplitHard(i, Parse1RE2); } 5000d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_SplitHard_BitState(int i) { Parse1SplitHard(i, Parse1BitState); } 5010d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 5020d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#ifdef USEPCRE 5030d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_SplitHard_PCRE)->ThreadRange(1, NumCPUs()); 5040d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#endif 5050d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_SplitHard_RE2)->ThreadRange(1, NumCPUs()); 5060d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_SplitHard_BitState)->ThreadRange(1, NumCPUs()); 5070d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_SplitHard_NFA)->ThreadRange(1, NumCPUs()); 5080d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 5090d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_CachedSplitHard_NFA(int i) { Parse1SplitHard(i, Parse1CachedNFA); } 5100d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_CachedSplitHard_PCRE(int i) { Parse1SplitHard(i, Parse1CachedPCRE); } 5110d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_CachedSplitHard_RE2(int i) { Parse1SplitHard(i, Parse1CachedRE2); } 5120d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_CachedSplitHard_BitState(int i) { Parse1SplitHard(i, Parse1CachedBitState); } 5130d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_CachedSplitHard_Backtrack(int i) { Parse1SplitHard(i, Parse1CachedBacktrack); } 5140d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 5150d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#ifdef USEPCRE 5160d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_CachedSplitHard_PCRE)->ThreadRange(1, NumCPUs()); 5170d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#endif 5180d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_CachedSplitHard_RE2)->ThreadRange(1, NumCPUs()); 5190d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_CachedSplitHard_BitState)->ThreadRange(1, NumCPUs()); 5200d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_CachedSplitHard_NFA)->ThreadRange(1, NumCPUs()); 5210d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_CachedSplitHard_Backtrack)->ThreadRange(1, NumCPUs()); 5220d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 5230d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// Benchmark: Parse1SplitHard, big text, small match. 5240d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 5250d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse1SplitBig1(int iters, 5260d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin void (*run)(int, const char*, const StringPiece&)) { 5270d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin string s; 5280d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin s.append(100000, 'x'); 5290d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin s.append("650-253-0001"); 5300d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin BenchmarkMemoryUsage(); 5310d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin run(iters, "[0-9]+.(.*)", s); 5320d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin SetBenchmarkItemsProcessed(iters); 5330d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 5340d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 5350d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_CachedSplitBig1_PCRE(int i) { Parse1SplitBig1(i, SearchParse1CachedPCRE); } 5360d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_CachedSplitBig1_RE2(int i) { Parse1SplitBig1(i, SearchParse1CachedRE2); } 5370d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 5380d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#ifdef USEPCRE 5390d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_CachedSplitBig1_PCRE)->ThreadRange(1, NumCPUs()); 5400d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#endif 5410d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_CachedSplitBig1_RE2)->ThreadRange(1, NumCPUs()); 5420d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 5430d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// Benchmark: Parse1SplitHard, big text, big match. 5440d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 5450d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse1SplitBig2(int iters, 5460d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin void (*run)(int, const char*, const StringPiece&)) { 5470d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin string s; 5480d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin s.append("650-253-"); 5490d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin s.append(100000, '0'); 5500d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin BenchmarkMemoryUsage(); 5510d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin run(iters, "[0-9]+.(.*)", s); 5520d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin SetBenchmarkItemsProcessed(iters); 5530d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 5540d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 5550d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_CachedSplitBig2_PCRE(int i) { Parse1SplitBig2(i, SearchParse1CachedPCRE); } 5560d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse_CachedSplitBig2_RE2(int i) { Parse1SplitBig2(i, SearchParse1CachedRE2); } 5570d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 5580d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#ifdef USEPCRE 5590d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_CachedSplitBig2_PCRE)->ThreadRange(1, NumCPUs()); 5600d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#endif 5610d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(Parse_CachedSplitBig2_RE2)->ThreadRange(1, NumCPUs()); 5620d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 5630d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// Benchmark: measure time required to parse (but not execute) 5640d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// a simple regular expression. 5650d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 5660d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid ParseRegexp(int iters, const string& regexp) { 5670d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 5680d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); 5690d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(re); 5700d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin re->Decref(); 5710d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 5720d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 5730d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 5740d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid SimplifyRegexp(int iters, const string& regexp) { 5750d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 5760d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); 5770d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(re); 5780d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Regexp* sre = re->Simplify(); 5790d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(sre); 5800d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin sre->Decref(); 5810d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin re->Decref(); 5820d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 5830d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 5840d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 5850d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid NullWalkRegexp(int iters, const string& regexp) { 5860d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); 5870d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(re); 5880d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 5890d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin re->NullWalk(); 5900d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 5910d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin re->Decref(); 5920d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 5930d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 5940d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid SimplifyCompileRegexp(int iters, const string& regexp) { 5950d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 5960d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); 5970d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(re); 5980d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Regexp* sre = re->Simplify(); 5990d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(sre); 6000d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog* prog = sre->CompileToProg(0); 6010d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog); 6020d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin delete prog; 6030d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin sre->Decref(); 6040d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin re->Decref(); 6050d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 6060d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 6070d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 6080d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid CompileRegexp(int iters, const string& regexp) { 6090d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 6100d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); 6110d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(re); 6120d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog* prog = re->CompileToProg(0); 6130d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog); 6140d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin delete prog; 6150d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin re->Decref(); 6160d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 6170d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 6180d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 6190d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid CompileToProg(int iters, const string& regexp) { 6200d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); 6210d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(re); 6220d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 6230d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog* prog = re->CompileToProg(0); 6240d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog); 6250d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin delete prog; 6260d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 6270d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin re->Decref(); 6280d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 6290d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 6300d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid CompileByteMap(int iters, const string& regexp) { 6310d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); 6320d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(re); 6330d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog* prog = re->CompileToProg(0); 6340d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog); 6350d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 6360d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin prog->ComputeByteMap(); 6370d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 6380d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin delete prog; 6390d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin re->Decref(); 6400d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 6410d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 6420d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid CompilePCRE(int iters, const string& regexp) { 6430d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 6440d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin PCRE re(regexp, PCRE::UTF8); 6450d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(re.error(), ""); 6460d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 6470d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 6480d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 6490d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid CompileRE2(int iters, const string& regexp) { 6500d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 6510d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin RE2 re(regexp); 6520d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(re.error(), ""); 6530d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 6540d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 6550d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 6560d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid RunBuild(int iters, const string& regexp, void (*run)(int, const string&)) { 6570d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin run(iters, regexp); 6580d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin SetBenchmarkItemsProcessed(iters); 6590d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 6600d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 6610d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} // namespace re2 6620d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 6630d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinDEFINE_string(compile_regexp, "(.*)-(\\d+)-of-(\\d+)", "regexp for compile benchmarks"); 6640d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 6650d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinnamespace re2 { 6660d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 6670d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid BM_PCRE_Compile(int i) { RunBuild(i, FLAGS_compile_regexp, CompilePCRE); } 6680d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid BM_Regexp_Parse(int i) { RunBuild(i, FLAGS_compile_regexp, ParseRegexp); } 6690d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid BM_Regexp_Simplify(int i) { RunBuild(i, FLAGS_compile_regexp, SimplifyRegexp); } 6700d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid BM_CompileToProg(int i) { RunBuild(i, FLAGS_compile_regexp, CompileToProg); } 6710d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid BM_CompileByteMap(int i) { RunBuild(i, FLAGS_compile_regexp, CompileByteMap); } 6720d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid BM_Regexp_Compile(int i) { RunBuild(i, FLAGS_compile_regexp, CompileRegexp); } 6730d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid BM_Regexp_SimplifyCompile(int i) { RunBuild(i, FLAGS_compile_regexp, SimplifyCompileRegexp); } 6740d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid BM_Regexp_NullWalk(int i) { RunBuild(i, FLAGS_compile_regexp, NullWalkRegexp); } 6750d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid BM_RE2_Compile(int i) { RunBuild(i, FLAGS_compile_regexp, CompileRE2); } 6760d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 6770d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#ifdef USEPCRE 6780d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(BM_PCRE_Compile)->ThreadRange(1, NumCPUs()); 6790d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#endif 6800d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(BM_Regexp_Parse)->ThreadRange(1, NumCPUs()); 6810d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(BM_Regexp_Simplify)->ThreadRange(1, NumCPUs()); 6820d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(BM_CompileToProg)->ThreadRange(1, NumCPUs()); 6830d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(BM_CompileByteMap)->ThreadRange(1, NumCPUs()); 6840d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(BM_Regexp_Compile)->ThreadRange(1, NumCPUs()); 6850d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(BM_Regexp_SimplifyCompile)->ThreadRange(1, NumCPUs()); 6860d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(BM_Regexp_NullWalk)->ThreadRange(1, NumCPUs()); 6870d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(BM_RE2_Compile)->ThreadRange(1, NumCPUs()); 6880d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 6890d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 6900d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// Makes text of size nbytes, then calls run to search 6910d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// the text for regexp iters times. 6920d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid SearchPhone(int iters, int nbytes, ParseImpl* search) { 6930d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StopBenchmarkTiming(); 6940d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin string s; 6950d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin MakeText(&s, nbytes); 6960d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin s.append("(650) 253-0001"); 6970d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin BenchmarkMemoryUsage(); 6980d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StartBenchmarkTiming(); 6990d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin search(iters, "(\\d{3}-|\\(\\d{3}\\)\\s+)(\\d{3}-\\d{4})", s); 7000d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin SetBenchmarkBytesProcessed(static_cast<int64>(iters)*nbytes); 7010d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 7020d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 7030d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid SearchPhone_CachedPCRE(int i, int n) { 7040d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin SearchPhone(i, n, SearchParse2CachedPCRE); 7050d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 7060d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid SearchPhone_CachedRE2(int i, int n) { 7070d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin SearchPhone(i, n, SearchParse2CachedRE2); 7080d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 7090d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 7100d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#ifdef USEPCRE 7110d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(SearchPhone_CachedPCRE, 8, 16<<20)->ThreadRange(1, NumCPUs()); 7120d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#endif 7130d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(SearchPhone_CachedRE2, 8, 16<<20)->ThreadRange(1, NumCPUs()); 7140d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 7150d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin/* 7160d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinTODO(rsc): Make this work again. 7170d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 7180d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// Generates and returns a string over binary alphabet {0,1} that contains 7190d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// all possible binary sequences of length n as subsequences. The obvious 7200d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// brute force method would generate a string of length n * 2^n, but this 7210d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// generates a string of length n + 2^n - 1 called a De Bruijn cycle. 7220d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// See Knuth, The Art of Computer Programming, Vol 2, Exercise 3.2.2 #17. 7230d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinstatic string DeBruijnString(int n) { 7240d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_LT(n, 8*sizeof(int)); 7250d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_GT(n, 0); 7260d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 7270d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin vector<bool> did(1<<n); 7280d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < 1<<n; i++) 7290d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin did[i] = false; 7300d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 7310d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin string s; 7320d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < n-1; i++) 7330d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin s.append("0"); 7340d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin int bits = 0; 7350d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin int mask = (1<<n) - 1; 7360d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < (1<<n); i++) { 7370d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin bits <<= 1; 7380d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin bits &= mask; 7390d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin if (!did[bits|1]) { 7400d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin bits |= 1; 7410d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin s.append("1"); 7420d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } else { 7430d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin s.append("0"); 7440d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 7450d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(!did[bits]); 7460d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin did[bits] = true; 7470d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 7480d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin return s; 7490d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 7500d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 7510d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid CacheFill(int iters, int n, SearchImpl *srch) { 7520d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin string s = DeBruijnString(n+1); 7530d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin string t; 7540d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = n+1; i < 20; i++) { 7550d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin t = s + s; 7560d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin swap(s, t); 7570d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 7580d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin srch(iters, StringPrintf("0[01]{%d}$", n).c_str(), s, 7590d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog::kUnanchored, true); 7600d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin SetBenchmarkBytesProcessed(static_cast<int64>(iters)*s.size()); 7610d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 7620d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 7630d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid CacheFillPCRE(int i, int n) { CacheFill(i, n, SearchCachedPCRE); } 7640d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid CacheFillRE2(int i, int n) { CacheFill(i, n, SearchCachedRE2); } 7650d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid CacheFillNFA(int i, int n) { CacheFill(i, n, SearchCachedNFA); } 7660d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid CacheFillDFA(int i, int n) { CacheFill(i, n, SearchCachedDFA); } 7670d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 7680d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// BENCHMARK_WITH_ARG uses __LINE__ to generate distinct identifiers 7690d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// for the static BenchmarkRegisterer, which makes it unusable inside 7700d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// a macro like DO24 below. MY_BENCHMARK_WITH_ARG uses the argument a 7710d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// to make the identifiers distinct (only possible when 'a' is a simple 7720d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// expression like 2, not like 1+1). 7730d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#define MY_BENCHMARK_WITH_ARG(n, a) \ 7740d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin bool __benchmark_ ## n ## a = \ 7750d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin (new ::testing::Benchmark(#n, NewPermanentCallback(&n)))->ThreadRange(1, NumCPUs()); 7760d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 7770d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#define DO24(A, B) \ 7780d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin A(B, 1); A(B, 2); A(B, 3); A(B, 4); A(B, 5); A(B, 6); \ 7790d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin A(B, 7); A(B, 8); A(B, 9); A(B, 10); A(B, 11); A(B, 12); \ 7800d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin A(B, 13); A(B, 14); A(B, 15); A(B, 16); A(B, 17); A(B, 18); \ 7810d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin A(B, 19); A(B, 20); A(B, 21); A(B, 22); A(B, 23); A(B, 24); 7820d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 7830d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinDO24(MY_BENCHMARK_WITH_ARG, CacheFillPCRE) 7840d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinDO24(MY_BENCHMARK_WITH_ARG, CacheFillNFA) 7850d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinDO24(MY_BENCHMARK_WITH_ARG, CacheFillRE2) 7860d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinDO24(MY_BENCHMARK_WITH_ARG, CacheFillDFA) 7870d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 7880d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#undef DO24 7890d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#undef MY_BENCHMARK_WITH_ARG 7900d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin*/ 7910d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 7920d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin//////////////////////////////////////////////////////////////////////// 7930d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// 7940d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// Implementation routines. Sad that there are so many, 7950d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// but all the interfaces are slightly different. 7960d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 7970d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// Runs implementation to search for regexp in text, iters times. 7980d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// Expect_match says whether the regexp should be found. 7990d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// Anchored says whether to run an anchored search. 8000d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 8010d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid SearchDFA(int iters, const char* regexp, const StringPiece& text, 8020d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog::Anchor anchor, bool expect_match) { 8030d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 8040d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); 8050d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(re); 8060d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog* prog = re->CompileToProg(0); 8070d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog); 8080d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin bool failed = false; 8090d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(prog->SearchDFA(text, NULL, anchor, Prog::kFirstMatch, 8100d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin NULL, &failed, NULL), 8110d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin expect_match); 8120d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(!failed); 8130d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin delete prog; 8140d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin re->Decref(); 8150d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 8160d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 8170d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 8180d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid SearchNFA(int iters, const char* regexp, const StringPiece& text, 8190d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog::Anchor anchor, bool expect_match) { 8200d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 8210d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); 8220d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(re); 8230d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog* prog = re->CompileToProg(0); 8240d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog); 8250d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(prog->SearchNFA(text, NULL, anchor, Prog::kFirstMatch, NULL, 0), 8260d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin expect_match); 8270d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin delete prog; 8280d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin re->Decref(); 8290d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 8300d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 8310d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 8320d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid SearchOnePass(int iters, const char* regexp, const StringPiece& text, 8330d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog::Anchor anchor, bool expect_match) { 8340d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 8350d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); 8360d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(re); 8370d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog* prog = re->CompileToProg(0); 8380d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog); 8390d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog->IsOnePass()); 8400d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(prog->SearchOnePass(text, text, anchor, Prog::kFirstMatch, NULL, 0), 8410d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin expect_match); 8420d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin delete prog; 8430d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin re->Decref(); 8440d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 8450d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 8460d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 8470d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid SearchBitState(int iters, const char* regexp, const StringPiece& text, 8480d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog::Anchor anchor, bool expect_match) { 8490d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 8500d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); 8510d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(re); 8520d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog* prog = re->CompileToProg(0); 8530d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog); 8540d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(prog->SearchBitState(text, text, anchor, Prog::kFirstMatch, NULL, 0), 8550d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin expect_match); 8560d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin delete prog; 8570d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin re->Decref(); 8580d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 8590d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 8600d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 8610d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid SearchPCRE(int iters, const char* regexp, const StringPiece& text, 8620d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog::Anchor anchor, bool expect_match) { 8630d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 8640d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin PCRE re(regexp, PCRE::UTF8); 8650d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(re.error(), ""); 8660d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin if (anchor == Prog::kAnchored) 8670d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(PCRE::FullMatch(text, re), expect_match); 8680d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin else 8690d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(PCRE::PartialMatch(text, re), expect_match); 8700d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 8710d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 8720d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 8730d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid SearchRE2(int iters, const char* regexp, const StringPiece& text, 8740d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog::Anchor anchor, bool expect_match) { 8750d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 8760d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin RE2 re(regexp); 8770d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(re.error(), ""); 8780d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin if (anchor == Prog::kAnchored) 8790d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(RE2::FullMatch(text, re), expect_match); 8800d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin else 8810d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(RE2::PartialMatch(text, re), expect_match); 8820d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 8830d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 8840d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 8850d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// SearchCachedXXX is like SearchXXX but only does the 8860d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// regexp parsing and compiling once. This lets us measure 8870d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// search time without the per-regexp overhead. 8880d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 8890d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid SearchCachedDFA(int iters, const char* regexp, const StringPiece& text, 8900d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog::Anchor anchor, bool expect_match) { 8910d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); 8920d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(re); 8930d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog* prog = re->CompileToProg(1LL<<31); 8940d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog); 8950d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 8960d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin bool failed = false; 8970d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(prog->SearchDFA(text, NULL, anchor, 8980d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog::kFirstMatch, NULL, &failed, NULL), 8990d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin expect_match); 9000d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(!failed); 9010d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 9020d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin delete prog; 9030d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin re->Decref(); 9040d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 9050d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 9060d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid SearchCachedNFA(int iters, const char* regexp, const StringPiece& text, 9070d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog::Anchor anchor, bool expect_match) { 9080d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); 9090d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(re); 9100d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog* prog = re->CompileToProg(0); 9110d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog); 9120d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 9130d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(prog->SearchNFA(text, NULL, anchor, Prog::kFirstMatch, NULL, 0), 9140d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin expect_match); 9150d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 9160d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin delete prog; 9170d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin re->Decref(); 9180d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 9190d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 9200d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid SearchCachedOnePass(int iters, const char* regexp, const StringPiece& text, 9210d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog::Anchor anchor, bool expect_match) { 9220d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); 9230d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(re); 9240d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog* prog = re->CompileToProg(0); 9250d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog); 9260d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog->IsOnePass()); 9270d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) 9280d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(prog->SearchOnePass(text, text, anchor, Prog::kFirstMatch, NULL, 0), 9290d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin expect_match); 9300d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin delete prog; 9310d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin re->Decref(); 9320d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 9330d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 9340d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid SearchCachedBitState(int iters, const char* regexp, const StringPiece& text, 9350d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog::Anchor anchor, bool expect_match) { 9360d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); 9370d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(re); 9380d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog* prog = re->CompileToProg(0); 9390d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog); 9400d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) 9410d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(prog->SearchBitState(text, text, anchor, Prog::kFirstMatch, NULL, 0), 9420d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin expect_match); 9430d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin delete prog; 9440d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin re->Decref(); 9450d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 9460d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 9470d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid SearchCachedPCRE(int iters, const char* regexp, const StringPiece& text, 9480d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog::Anchor anchor, bool expect_match) { 9490d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin PCRE re(regexp, PCRE::UTF8); 9500d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(re.error(), ""); 9510d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 9520d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin if (anchor == Prog::kAnchored) 9530d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(PCRE::FullMatch(text, re), expect_match); 9540d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin else 9550d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(PCRE::PartialMatch(text, re), expect_match); 9560d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 9570d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 9580d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 9590d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid SearchCachedRE2(int iters, const char* regexp, const StringPiece& text, 9600d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog::Anchor anchor, bool expect_match) { 9610d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin RE2 re(regexp); 9620d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(re.error(), ""); 9630d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 9640d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin if (anchor == Prog::kAnchored) 9650d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(RE2::FullMatch(text, re), expect_match); 9660d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin else 9670d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(RE2::PartialMatch(text, re), expect_match); 9680d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 9690d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 9700d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 9710d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 9720d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// Runs implementation to full match regexp against text, 9730d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// extracting three submatches. Expects match always. 9740d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 9750d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse3NFA(int iters, const char* regexp, const StringPiece& text) { 9760d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 9770d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); 9780d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(re); 9790d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog* prog = re->CompileToProg(0); 9800d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog); 9810d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece sp[4]; // 4 because sp[0] is whole match. 9820d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog->SearchNFA(text, NULL, Prog::kAnchored, Prog::kFullMatch, sp, 4)); 9830d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin delete prog; 9840d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin re->Decref(); 9850d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 9860d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 9870d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 9880d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse3OnePass(int iters, const char* regexp, const StringPiece& text) { 9890d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 9900d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); 9910d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(re); 9920d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog* prog = re->CompileToProg(0); 9930d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog); 9940d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog->IsOnePass()); 9950d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece sp[4]; // 4 because sp[0] is whole match. 9960d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog->SearchOnePass(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 4)); 9970d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin delete prog; 9980d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin re->Decref(); 9990d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 10000d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 10010d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 10020d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse3BitState(int iters, const char* regexp, const StringPiece& text) { 10030d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 10040d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); 10050d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(re); 10060d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog* prog = re->CompileToProg(0); 10070d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog); 10080d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece sp[4]; // 4 because sp[0] is whole match. 10090d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog->SearchBitState(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 4)); 10100d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin delete prog; 10110d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin re->Decref(); 10120d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 10130d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 10140d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 10150d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse3Backtrack(int iters, const char* regexp, const StringPiece& text) { 10160d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 10170d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); 10180d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(re); 10190d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog* prog = re->CompileToProg(0); 10200d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog); 10210d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece sp[4]; // 4 because sp[0] is whole match. 10220d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog->UnsafeSearchBacktrack(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 4)); 10230d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin delete prog; 10240d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin re->Decref(); 10250d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 10260d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 10270d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 10280d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse3PCRE(int iters, const char* regexp, const StringPiece& text) { 10290d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 10300d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin PCRE re(regexp, PCRE::UTF8); 10310d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(re.error(), ""); 10320d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece sp1, sp2, sp3; 10330d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(PCRE::FullMatch(text, re, &sp1, &sp2, &sp3)); 10340d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 10350d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 10360d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 10370d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse3RE2(int iters, const char* regexp, const StringPiece& text) { 10380d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 10390d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin RE2 re(regexp); 10400d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(re.error(), ""); 10410d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece sp1, sp2, sp3; 10420d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(RE2::FullMatch(text, re, &sp1, &sp2, &sp3)); 10430d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 10440d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 10450d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 10460d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse3CachedNFA(int iters, const char* regexp, const StringPiece& text) { 10470d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); 10480d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(re); 10490d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog* prog = re->CompileToProg(0); 10500d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog); 10510d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece sp[4]; // 4 because sp[0] is whole match. 10520d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 10530d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog->SearchNFA(text, NULL, Prog::kAnchored, Prog::kFullMatch, sp, 4)); 10540d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 10550d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin delete prog; 10560d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin re->Decref(); 10570d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 10580d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 10590d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse3CachedOnePass(int iters, const char* regexp, const StringPiece& text) { 10600d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); 10610d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(re); 10620d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog* prog = re->CompileToProg(0); 10630d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog); 10640d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog->IsOnePass()); 10650d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece sp[4]; // 4 because sp[0] is whole match. 10660d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) 10670d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog->SearchOnePass(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 4)); 10680d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin delete prog; 10690d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin re->Decref(); 10700d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 10710d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 10720d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse3CachedBitState(int iters, const char* regexp, const StringPiece& text) { 10730d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); 10740d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(re); 10750d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog* prog = re->CompileToProg(0); 10760d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog); 10770d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece sp[4]; // 4 because sp[0] is whole match. 10780d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) 10790d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog->SearchBitState(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 4)); 10800d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin delete prog; 10810d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin re->Decref(); 10820d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 10830d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 10840d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse3CachedBacktrack(int iters, const char* regexp, const StringPiece& text) { 10850d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); 10860d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(re); 10870d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog* prog = re->CompileToProg(0); 10880d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog); 10890d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece sp[4]; // 4 because sp[0] is whole match. 10900d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) 10910d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog->UnsafeSearchBacktrack(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 4)); 10920d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin delete prog; 10930d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin re->Decref(); 10940d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 10950d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 10960d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse3CachedPCRE(int iters, const char* regexp, const StringPiece& text) { 10970d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin PCRE re(regexp, PCRE::UTF8); 10980d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(re.error(), ""); 10990d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece sp1, sp2, sp3; 11000d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 11010d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(PCRE::FullMatch(text, re, &sp1, &sp2, &sp3)); 11020d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 11030d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 11040d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 11050d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse3CachedRE2(int iters, const char* regexp, const StringPiece& text) { 11060d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin RE2 re(regexp); 11070d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(re.error(), ""); 11080d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece sp1, sp2, sp3; 11090d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 11100d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(RE2::FullMatch(text, re, &sp1, &sp2, &sp3)); 11110d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 11120d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 11130d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 11140d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 11150d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// Runs implementation to full match regexp against text, 11160d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin// extracting three submatches. Expects match always. 11170d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 11180d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse1NFA(int iters, const char* regexp, const StringPiece& text) { 11190d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 11200d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); 11210d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(re); 11220d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog* prog = re->CompileToProg(0); 11230d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog); 11240d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece sp[2]; // 2 because sp[0] is whole match. 11250d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog->SearchNFA(text, NULL, Prog::kAnchored, Prog::kFullMatch, sp, 2)); 11260d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin delete prog; 11270d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin re->Decref(); 11280d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 11290d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 11300d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 11310d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse1OnePass(int iters, const char* regexp, const StringPiece& text) { 11320d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 11330d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); 11340d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(re); 11350d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog* prog = re->CompileToProg(0); 11360d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog); 11370d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog->IsOnePass()); 11380d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece sp[2]; // 2 because sp[0] is whole match. 11390d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog->SearchOnePass(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 2)); 11400d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin delete prog; 11410d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin re->Decref(); 11420d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 11430d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 11440d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 11450d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse1BitState(int iters, const char* regexp, const StringPiece& text) { 11460d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 11470d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); 11480d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(re); 11490d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog* prog = re->CompileToProg(0); 11500d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog); 11510d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece sp[2]; // 2 because sp[0] is whole match. 11520d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog->SearchBitState(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 2)); 11530d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin delete prog; 11540d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin re->Decref(); 11550d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 11560d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 11570d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 11580d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse1PCRE(int iters, const char* regexp, const StringPiece& text) { 11590d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 11600d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin PCRE re(regexp, PCRE::UTF8); 11610d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(re.error(), ""); 11620d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece sp1; 11630d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(PCRE::FullMatch(text, re, &sp1)); 11640d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 11650d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 11660d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 11670d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse1RE2(int iters, const char* regexp, const StringPiece& text) { 11680d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 11690d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin RE2 re(regexp); 11700d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(re.error(), ""); 11710d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece sp1; 11720d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(RE2::FullMatch(text, re, &sp1)); 11730d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 11740d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 11750d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 11760d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse1CachedNFA(int iters, const char* regexp, const StringPiece& text) { 11770d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); 11780d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(re); 11790d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog* prog = re->CompileToProg(0); 11800d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog); 11810d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece sp[2]; // 2 because sp[0] is whole match. 11820d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 11830d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog->SearchNFA(text, NULL, Prog::kAnchored, Prog::kFullMatch, sp, 2)); 11840d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 11850d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin delete prog; 11860d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin re->Decref(); 11870d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 11880d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 11890d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse1CachedOnePass(int iters, const char* regexp, const StringPiece& text) { 11900d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); 11910d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(re); 11920d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog* prog = re->CompileToProg(0); 11930d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog); 11940d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog->IsOnePass()); 11950d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece sp[2]; // 2 because sp[0] is whole match. 11960d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) 11970d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog->SearchOnePass(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 2)); 11980d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin delete prog; 11990d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin re->Decref(); 12000d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 12010d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 12020d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse1CachedBitState(int iters, const char* regexp, const StringPiece& text) { 12030d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); 12040d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(re); 12050d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog* prog = re->CompileToProg(0); 12060d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog); 12070d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece sp[2]; // 2 because sp[0] is whole match. 12080d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) 12090d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog->SearchBitState(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 2)); 12100d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin delete prog; 12110d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin re->Decref(); 12120d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 12130d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 12140d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse1CachedBacktrack(int iters, const char* regexp, const StringPiece& text) { 12150d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Regexp* re = Regexp::Parse(regexp, Regexp::LikePerl, NULL); 12160d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(re); 12170d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin Prog* prog = re->CompileToProg(0); 12180d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog); 12190d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece sp[2]; // 2 because sp[0] is whole match. 12200d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) 12210d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(prog->UnsafeSearchBacktrack(text, text, Prog::kAnchored, Prog::kFullMatch, sp, 2)); 12220d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin delete prog; 12230d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin re->Decref(); 12240d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 12250d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 12260d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse1CachedPCRE(int iters, const char* regexp, const StringPiece& text) { 12270d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin PCRE re(regexp, PCRE::UTF8); 12280d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(re.error(), ""); 12290d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece sp1; 12300d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 12310d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(PCRE::FullMatch(text, re, &sp1)); 12320d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 12330d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 12340d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 12350d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid Parse1CachedRE2(int iters, const char* regexp, const StringPiece& text) { 12360d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin RE2 re(regexp); 12370d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(re.error(), ""); 12380d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece sp1; 12390d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 12400d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(RE2::FullMatch(text, re, &sp1)); 12410d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 12420d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 12430d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 12440d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid SearchParse2CachedPCRE(int iters, const char* regexp, 12450d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin const StringPiece& text) { 12460d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin PCRE re(regexp, PCRE::UTF8); 12470d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(re.error(), ""); 12480d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 12490d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece sp1, sp2; 12500d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(PCRE::PartialMatch(text, re, &sp1, &sp2)); 12510d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 12520d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 12530d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 12540d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid SearchParse2CachedRE2(int iters, const char* regexp, 12550d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin const StringPiece& text) { 12560d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin RE2 re(regexp); 12570d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(re.error(), ""); 12580d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 12590d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece sp1, sp2; 12600d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(RE2::PartialMatch(text, re, &sp1, &sp2)); 12610d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 12620d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 12630d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 12640d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid SearchParse1CachedPCRE(int iters, const char* regexp, 12650d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin const StringPiece& text) { 12660d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin PCRE re(regexp, PCRE::UTF8); 12670d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(re.error(), ""); 12680d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 12690d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece sp1; 12700d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(PCRE::PartialMatch(text, re, &sp1)); 12710d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 12720d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 12730d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 12740d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid SearchParse1CachedRE2(int iters, const char* regexp, 12750d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin const StringPiece& text) { 12760d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin RE2 re(regexp); 12770d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK_EQ(re.error(), ""); 12780d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iters; i++) { 12790d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece sp1; 12800d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(RE2::PartialMatch(text, re, &sp1)); 12810d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 12820d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 12830d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 12840d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid EmptyPartialMatchPCRE(int n) { 12850d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin PCRE re(""); 12860d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < n; i++) { 12870d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin PCRE::PartialMatch("", re); 12880d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 12890d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 12900d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 12910d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid EmptyPartialMatchRE2(int n) { 12920d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin RE2 re(""); 12930d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < n; i++) { 12940d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin RE2::PartialMatch("", re); 12950d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 12960d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 12970d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#ifdef USEPCRE 12980d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(EmptyPartialMatchPCRE)->ThreadRange(1, NumCPUs()); 12990d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#endif 13000d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(EmptyPartialMatchRE2)->ThreadRange(1, NumCPUs()); 13010d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 13020d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid SimplePartialMatchPCRE(int n) { 13030d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin PCRE re("abcdefg"); 13040d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < n; i++) { 13050d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin PCRE::PartialMatch("abcdefg", re); 13060d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 13070d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 13080d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 13090d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid SimplePartialMatchRE2(int n) { 13100d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin RE2 re("abcdefg"); 13110d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < n; i++) { 13120d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin RE2::PartialMatch("abcdefg", re); 13130d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 13140d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 13150d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#ifdef USEPCRE 13160d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(SimplePartialMatchPCRE)->ThreadRange(1, NumCPUs()); 13170d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#endif 13180d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(SimplePartialMatchRE2)->ThreadRange(1, NumCPUs()); 13190d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 13200d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinstatic string http_text = 13210d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin "GET /asdfhjasdhfasdlfhasdflkjasdfkljasdhflaskdjhf" 13220d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin "alksdjfhasdlkfhasdlkjfhasdljkfhadsjklf HTTP/1.1"; 13230d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 13240d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid HTTPPartialMatchPCRE(int n) { 13250d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece a; 13260d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin PCRE re("(?-s)^(?:GET|POST) +([^ ]+) HTTP"); 13270d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < n; i++) { 13280d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin PCRE::PartialMatch(http_text, re, &a); 13290d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 13300d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 13310d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 13320d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid HTTPPartialMatchRE2(int n) { 13330d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece a; 13340d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin RE2 re("(?-s)^(?:GET|POST) +([^ ]+) HTTP"); 13350d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < n; i++) { 13360d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin RE2::PartialMatch(http_text, re, &a); 13370d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 13380d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 13390d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 13400d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#ifdef USEPCRE 13410d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(HTTPPartialMatchPCRE)->ThreadRange(1, NumCPUs()); 13420d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#endif 13430d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(HTTPPartialMatchRE2)->ThreadRange(1, NumCPUs()); 13440d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 13450d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinstatic string http_smalltext = 13460d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin "GET /abc HTTP/1.1"; 13470d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 13480d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid SmallHTTPPartialMatchPCRE(int n) { 13490d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece a; 13500d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin PCRE re("(?-s)^(?:GET|POST) +([^ ]+) HTTP"); 13510d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < n; i++) { 13520d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin PCRE::PartialMatch(http_text, re, &a); 13530d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 13540d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 13550d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 13560d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid SmallHTTPPartialMatchRE2(int n) { 13570d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece a; 13580d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin RE2 re("(?-s)^(?:GET|POST) +([^ ]+) HTTP"); 13590d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < n; i++) { 13600d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin RE2::PartialMatch(http_text, re, &a); 13610d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 13620d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 13630d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 13640d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#ifdef USEPCRE 13650d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(SmallHTTPPartialMatchPCRE)->ThreadRange(1, NumCPUs()); 13660d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#endif 13670d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(SmallHTTPPartialMatchRE2)->ThreadRange(1, NumCPUs()); 13680d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 13690d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid DotMatchPCRE(int n) { 13700d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece a; 13710d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin PCRE re("(?-s)^(.+)"); 13720d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < n; i++) { 13730d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin PCRE::PartialMatch(http_text, re, &a); 13740d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 13750d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 13760d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 13770d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid DotMatchRE2(int n) { 13780d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece a; 13790d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin RE2 re("(?-s)^(.+)"); 13800d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < n; i++) { 13810d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin RE2::PartialMatch(http_text, re, &a); 13820d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 13830d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 13840d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 13850d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#ifdef USEPCRE 13860d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(DotMatchPCRE)->ThreadRange(1, NumCPUs()); 13870d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#endif 13880d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(DotMatchRE2)->ThreadRange(1, NumCPUs()); 13890d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 13900d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid ASCIIMatchPCRE(int n) { 13910d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece a; 13920d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin PCRE re("(?-s)^([ -~]+)"); 13930d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < n; i++) { 13940d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin PCRE::PartialMatch(http_text, re, &a); 13950d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 13960d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 13970d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 13980d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid ASCIIMatchRE2(int n) { 13990d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StringPiece a; 14000d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin RE2 re("(?-s)^([ -~]+)"); 14010d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < n; i++) { 14020d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin RE2::PartialMatch(http_text, re, &a); 14030d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin } 14040d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 14050d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 14060d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#ifdef USEPCRE 14070d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(ASCIIMatchPCRE)->ThreadRange(1, NumCPUs()); 14080d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#endif 14090d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK(ASCIIMatchRE2)->ThreadRange(1, NumCPUs()); 14100d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 14110d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid FullMatchPCRE(int iter, int n, const char *regexp) { 14120d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StopBenchmarkTiming(); 14130d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin string s; 14140d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin MakeText(&s, n); 14150d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin s += "ABCDEFGHIJ"; 14160d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin BenchmarkMemoryUsage(); 14170d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin PCRE re(regexp); 14180d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StartBenchmarkTiming(); 14190d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iter; i++) 14200d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(PCRE::FullMatch(s, re)); 14210d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin SetBenchmarkBytesProcessed(static_cast<int64>(iter)*n); 14220d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 14230d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 14240d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid FullMatchRE2(int iter, int n, const char *regexp) { 14250d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StopBenchmarkTiming(); 14260d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin string s; 14270d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin MakeText(&s, n); 14280d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin s += "ABCDEFGHIJ"; 14290d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin BenchmarkMemoryUsage(); 14300d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin RE2 re(regexp, RE2::Latin1); 14310d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin StartBenchmarkTiming(); 14320d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin for (int i = 0; i < iter; i++) 14330d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin CHECK(RE2::FullMatch(s, re)); 14340d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin SetBenchmarkBytesProcessed(static_cast<int64>(iter)*n); 14350d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} 14360d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 14370d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid FullMatch_DotStar_CachedPCRE(int i, int n) { FullMatchPCRE(i, n, "(?s).*"); } 14380d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid FullMatch_DotStar_CachedRE2(int i, int n) { FullMatchRE2(i, n, "(?s).*"); } 14390d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 14400d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid FullMatch_DotStarDollar_CachedPCRE(int i, int n) { FullMatchPCRE(i, n, "(?s).*$"); } 14410d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid FullMatch_DotStarDollar_CachedRE2(int i, int n) { FullMatchRE2(i, n, "(?s).*$"); } 14420d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 14430d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid FullMatch_DotStarCapture_CachedPCRE(int i, int n) { FullMatchPCRE(i, n, "(?s)((.*)()()($))"); } 14440d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkinvoid FullMatch_DotStarCapture_CachedRE2(int i, int n) { FullMatchRE2(i, n, "(?s)((.*)()()($))"); } 14450d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 14460d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#ifdef USEPCRE 14470d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(FullMatch_DotStar_CachedPCRE, 8, 2<<20); 14480d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#endif 14490d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(FullMatch_DotStar_CachedRE2, 8, 2<<20); 14500d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 14510d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#ifdef USEPCRE 14520d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(FullMatch_DotStarDollar_CachedPCRE, 8, 2<<20); 14530d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#endif 14540d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(FullMatch_DotStarDollar_CachedRE2, 8, 2<<20); 14550d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 14560d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#ifdef USEPCRE 14570d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(FullMatch_DotStarCapture_CachedPCRE, 8, 2<<20); 14580d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin#endif 14590d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander GutkinBENCHMARK_RANGE(FullMatch_DotStarCapture_CachedRE2, 8, 2<<20); 14600d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin 14610d4c52358a1af421705c54bd8a9fdd8a30558a2eAlexander Gutkin} // namespace re2 1462