Skip to content

Commit 472ee43

Browse files
authored
[NFC][SpecialCaseList] Add SpecialCaseList Benchmark (#163274)
At the moment it's focused on "src:" patterns.
1 parent d9a6ed7 commit 472ee43

File tree

2 files changed

+208
-0
lines changed

2 files changed

+208
-0
lines changed

llvm/benchmarks/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ add_benchmark(FormatVariadicBM FormatVariadicBM.cpp PARTIAL_SOURCES_INTENDED)
1111
add_benchmark(GetIntrinsicInfoTableEntriesBM GetIntrinsicInfoTableEntriesBM.cpp PARTIAL_SOURCES_INTENDED)
1212
add_benchmark(SandboxIRBench SandboxIRBench.cpp PARTIAL_SOURCES_INTENDED)
1313
add_benchmark(MustacheBench Mustache.cpp PARTIAL_SOURCES_INTENDED)
14+
add_benchmark(SpecialCaseListBM SpecialCaseListBM.cpp PARTIAL_SOURCES_INTENDED)
1415

1516
add_benchmark(RuntimeLibcallsBench RuntimeLibcalls.cpp PARTIAL_SOURCES_INTENDED)
1617

Lines changed: 207 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,207 @@
1+
#include "benchmark/benchmark.h"
2+
#include "llvm/ADT/SmallString.h"
3+
#include "llvm/ADT/StringRef.h"
4+
#include "llvm/Support/MemoryBuffer.h"
5+
#include "llvm/Support/SpecialCaseList.h"
6+
#include "llvm/Support/raw_ostream.h"
7+
#include <cassert>
8+
#include <iterator>
9+
#include <random>
10+
#include <string>
11+
#include <utility>
12+
#include <vector>
13+
14+
using namespace llvm;
15+
16+
namespace {
17+
constexpr int RNG_SEED = 123456;
18+
constexpr int MAX_LIST_MIN = 10;
19+
constexpr int MAX_LIST_MAX = 1000000;
20+
constexpr int MAX_LIST_MUL = 10;
21+
22+
std::unique_ptr<SpecialCaseList> makeSpecialCaseList(StringRef List) {
23+
std::string Error;
24+
std::unique_ptr<MemoryBuffer> MB = MemoryBuffer::getMemBuffer(List);
25+
auto SCL = SpecialCaseList::create(MB.get(), Error);
26+
assert(SCL);
27+
assert(Error == "");
28+
return SCL;
29+
}
30+
31+
static const std::string Dictionary[] = {
32+
"orange", "tabby", "tortie", "tuxedo", "void",
33+
"multiple", "spaces", "cute", "fluffy", "kittens",
34+
};
35+
36+
std::vector<std::string> genFiles(size_t NumFiles) {
37+
std::vector<std::string> R;
38+
R.reserve(NumFiles);
39+
std::minstd_rand Rng(RNG_SEED);
40+
std::uniform_int_distribution<> DepthDistrib(8, 16);
41+
std::uniform_int_distribution<> WordDistrib(0, std::size(Dictionary) - 1);
42+
43+
std::string S;
44+
for (size_t I = 0; I < NumFiles; ++I) {
45+
for (size_t D = DepthDistrib(Rng); D; --D) {
46+
S += Dictionary[WordDistrib(Rng)];
47+
if (D > 1)
48+
S += "/";
49+
}
50+
R.push_back(std::move(S));
51+
S.clear();
52+
}
53+
return R;
54+
}
55+
56+
std::string genGlobNone(const std::vector<std::string> &Files) {
57+
std::string S;
58+
for (const auto &F : Files) {
59+
S += "src:";
60+
S += F;
61+
S += "\n";
62+
}
63+
return S;
64+
}
65+
66+
std::string genGlobInMid(const std::vector<std::string> &Files) {
67+
std::string S;
68+
std::minstd_rand Rng(RNG_SEED);
69+
for (std::string F : Files) {
70+
std::uniform_int_distribution<> PosDistrib(0, F.size() - 1);
71+
F[PosDistrib(Rng)] = '*';
72+
S += "src:";
73+
S += F;
74+
S += "\n";
75+
}
76+
return S;
77+
}
78+
79+
std::string genGlobAtStart(const std::vector<std::string> &Files) {
80+
std::string S;
81+
for (std::string F : Files) {
82+
F.front() = '*';
83+
S += "src:";
84+
S += F;
85+
S += "\n";
86+
}
87+
return S;
88+
}
89+
90+
std::string genGlobAtEnd(const std::vector<std::string> &Files) {
91+
std::string S;
92+
for (std::string F : Files) {
93+
F.back() = '*';
94+
S += "src:";
95+
S += F;
96+
S += "\n";
97+
}
98+
return S;
99+
}
100+
101+
std::string genGlobAtBothSides(const std::vector<std::string> &Files) {
102+
std::string S;
103+
for (std::string F : Files) {
104+
F.back() = '*';
105+
F.front() = '*';
106+
S += "src:";
107+
S += F;
108+
S += "\n";
109+
}
110+
return S;
111+
}
112+
113+
void BM_Make_(
114+
benchmark::State &state,
115+
std::string (*GenerateCaseList)(const std::vector<std::string> &Files)) {
116+
std::vector<std::string> BigFileList = genFiles(state.range(0));
117+
std::string BigCaseList = GenerateCaseList(BigFileList);
118+
for (auto _ : state) {
119+
auto SCL = makeSpecialCaseList(BigCaseList);
120+
benchmark::DoNotOptimize(SCL);
121+
}
122+
}
123+
void BM_True_(
124+
benchmark::State &state,
125+
std::string (*GenerateCaseList)(const std::vector<std::string> &Files)) {
126+
std::vector<std::string> BigFileList = genFiles(state.range(0));
127+
std::string BigCaseList = GenerateCaseList(BigFileList);
128+
auto SCL = makeSpecialCaseList(BigCaseList);
129+
std::minstd_rand Rng(RNG_SEED);
130+
std::uniform_int_distribution<> LineDistrib(0, BigFileList.size() - 1);
131+
for (auto _ : state) {
132+
auto &Q = BigFileList[LineDistrib(Rng)];
133+
bool R = SCL->inSection("", "src", Q);
134+
if (!R)
135+
abort();
136+
benchmark::DoNotOptimize(R);
137+
}
138+
}
139+
140+
void BM_False(
141+
benchmark::State &state,
142+
std::string (*GenerateCaseList)(const std::vector<std::string> &Files)) {
143+
std::vector<std::string> BigFileList = genFiles(state.range(0));
144+
std::string BigCaseList = GenerateCaseList(BigFileList);
145+
auto SCL = makeSpecialCaseList(BigCaseList);
146+
std::minstd_rand Rng(RNG_SEED);
147+
std::uniform_int_distribution<> LineDistrib(0, BigFileList.size() - 1);
148+
for (auto _ : state) {
149+
std::string Q = BigFileList[LineDistrib(Rng)];
150+
std::uniform_int_distribution<> PosDistrib(0, Q.size() - 1);
151+
Q[PosDistrib(Rng)] = '_';
152+
bool R = SCL->inSection("", "src", Q);
153+
benchmark::DoNotOptimize(R);
154+
}
155+
}
156+
157+
} // namespace
158+
159+
BENCHMARK_CAPTURE(BM_Make_, None_, genGlobNone)
160+
->RangeMultiplier(MAX_LIST_MUL)
161+
->Range(MAX_LIST_MIN, MAX_LIST_MAX);
162+
BENCHMARK_CAPTURE(BM_Make_, Start, genGlobAtStart)
163+
->RangeMultiplier(MAX_LIST_MUL)
164+
->Range(MAX_LIST_MIN, MAX_LIST_MAX);
165+
BENCHMARK_CAPTURE(BM_Make_, End__, genGlobAtEnd)
166+
->RangeMultiplier(MAX_LIST_MUL)
167+
->Range(MAX_LIST_MIN, MAX_LIST_MAX);
168+
BENCHMARK_CAPTURE(BM_Make_, Mid__, genGlobInMid)
169+
->RangeMultiplier(MAX_LIST_MUL)
170+
->Range(MAX_LIST_MIN, MAX_LIST_MAX);
171+
BENCHMARK_CAPTURE(BM_Make_, Both_, genGlobAtBothSides)
172+
->RangeMultiplier(MAX_LIST_MUL)
173+
->Range(MAX_LIST_MIN, MAX_LIST_MAX);
174+
175+
BENCHMARK_CAPTURE(BM_True_, None_, genGlobNone)
176+
->RangeMultiplier(MAX_LIST_MUL)
177+
->Range(MAX_LIST_MIN, MAX_LIST_MAX);
178+
BENCHMARK_CAPTURE(BM_True_, Start, genGlobAtStart)
179+
->RangeMultiplier(MAX_LIST_MUL)
180+
->Range(MAX_LIST_MIN, MAX_LIST_MAX);
181+
BENCHMARK_CAPTURE(BM_True_, End__, genGlobAtEnd)
182+
->RangeMultiplier(MAX_LIST_MUL)
183+
->Range(MAX_LIST_MIN, MAX_LIST_MAX);
184+
BENCHMARK_CAPTURE(BM_True_, Mid__, genGlobInMid)
185+
->RangeMultiplier(MAX_LIST_MUL)
186+
->Range(MAX_LIST_MIN, MAX_LIST_MAX);
187+
BENCHMARK_CAPTURE(BM_True_, Both_, genGlobAtBothSides)
188+
->RangeMultiplier(MAX_LIST_MUL)
189+
->Range(MAX_LIST_MIN, MAX_LIST_MAX);
190+
191+
BENCHMARK_CAPTURE(BM_False, None_, genGlobNone)
192+
->RangeMultiplier(MAX_LIST_MUL)
193+
->Range(MAX_LIST_MIN, MAX_LIST_MAX);
194+
BENCHMARK_CAPTURE(BM_False, Start, genGlobAtStart)
195+
->RangeMultiplier(MAX_LIST_MUL)
196+
->Range(MAX_LIST_MIN, MAX_LIST_MAX);
197+
BENCHMARK_CAPTURE(BM_False, End__, genGlobAtEnd)
198+
->RangeMultiplier(MAX_LIST_MUL)
199+
->Range(MAX_LIST_MIN, MAX_LIST_MAX);
200+
BENCHMARK_CAPTURE(BM_False, Mid__, genGlobInMid)
201+
->RangeMultiplier(MAX_LIST_MUL)
202+
->Range(MAX_LIST_MIN, MAX_LIST_MAX);
203+
BENCHMARK_CAPTURE(BM_False, Both_, genGlobAtBothSides)
204+
->RangeMultiplier(MAX_LIST_MUL)
205+
->Range(MAX_LIST_MIN, MAX_LIST_MAX);
206+
207+
BENCHMARK_MAIN();

0 commit comments

Comments
 (0)