Skip to content

Commit 647fa37

Browse files
committed
bench: add cluster linearization improvement benchmark
1 parent 2854979 commit 647fa37

File tree

1 file changed

+66
-14
lines changed

1 file changed

+66
-14
lines changed

src/bench/cluster_linearize.cpp

Lines changed: 66 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,21 @@ DepGraph<SetType> MakeLinearGraph(ClusterIndex ntx)
2626
return depgraph;
2727
}
2828

29+
/** Construct a wide graph (one root, with N-1 children that are otherwise unrelated, with
30+
* increasing feerates). These graphs are pessimal for the LIMO step in Linearize, because
31+
* rechunking is needed after every candidate (the last transaction gets picked every time).
32+
*/
33+
template<typename SetType>
34+
DepGraph<SetType> MakeWideGraph(ClusterIndex ntx)
35+
{
36+
DepGraph<SetType> depgraph;
37+
for (ClusterIndex i = 0; i < ntx; ++i) {
38+
depgraph.AddTransaction({int32_t(i) + 1, 1});
39+
if (i > 0) depgraph.AddDependency(0, i);
40+
}
41+
return depgraph;
42+
}
43+
2944
// Construct a difficult graph. These need at least sqrt(2^(n-1)) iterations in the best
3045
// known algorithms (purely empirically determined).
3146
template<typename SetType>
@@ -114,13 +129,16 @@ void BenchLinearizePerIterWorstCase(ClusterIndex ntx, benchmark::Bench& bench)
114129
* Its goal is measuring how much time linearization may take without any search iterations.
115130
*
116131
* If P is the resulting time of BenchLinearizePerIterWorstCase, and N is the resulting time of
117-
* BenchLinearizeNoItersWorstCase, then an invocation of Linearize with max_iterations=m should
132+
* BenchLinearizeNoItersWorstCase*, then an invocation of Linearize with max_iterations=m should
118133
* take no more than roughly N+m*P time. This may however be an overestimate, as the worst cases
119134
* do not coincide (the ones that are worst for linearization without any search happen to be ones
120135
* that do not need many search iterations).
136+
*
137+
* This benchmark exercises a worst case for AncestorCandidateFinder, but for which improvement is
138+
* cheap.
121139
*/
122140
template<typename SetType>
123-
void BenchLinearizeNoItersWorstCase(ClusterIndex ntx, benchmark::Bench& bench)
141+
void BenchLinearizeNoItersWorstCaseAnc(ClusterIndex ntx, benchmark::Bench& bench)
124142
{
125143
const auto depgraph = MakeLinearGraph<SetType>(ntx);
126144
uint64_t rng_seed = 0;
@@ -131,6 +149,26 @@ void BenchLinearizeNoItersWorstCase(ClusterIndex ntx, benchmark::Bench& bench)
131149
});
132150
}
133151

152+
/** Benchmark for linearization improvement of a trivial wide graph using just ancestor sort.
153+
*
154+
* Its goal is measuring how much time improving a linearization may take without any search
155+
* iterations, similar to the previous function.
156+
*
157+
* This benchmark exercises a worst case for improving an existing linearization, but for which
158+
* AncestorCandidateFinder is cheap.
159+
*/
160+
template<typename SetType>
161+
void BenchLinearizeNoItersWorstCaseLIMO(ClusterIndex ntx, benchmark::Bench& bench)
162+
{
163+
const auto depgraph = MakeWideGraph<SetType>(ntx);
164+
uint64_t rng_seed = 0;
165+
std::vector<ClusterIndex> old_lin(ntx);
166+
for (ClusterIndex i = 0; i < ntx; ++i) old_lin[i] = i;
167+
bench.run([&] {
168+
Linearize(depgraph, /*max_iterations=*/0, rng_seed++, old_lin);
169+
});
170+
}
171+
134172
} // namespace
135173

136174
static void LinearizePerIter16TxWorstCase(benchmark::Bench& bench) { BenchLinearizePerIterWorstCase<BitSet<16>>(16, bench); }
@@ -140,12 +178,19 @@ static void LinearizePerIter64TxWorstCase(benchmark::Bench& bench) { BenchLinear
140178
static void LinearizePerIter75TxWorstCase(benchmark::Bench& bench) { BenchLinearizePerIterWorstCase<BitSet<75>>(75, bench); }
141179
static void LinearizePerIter99TxWorstCase(benchmark::Bench& bench) { BenchLinearizePerIterWorstCase<BitSet<99>>(99, bench); }
142180

143-
static void LinearizeNoIters16TxWorstCase(benchmark::Bench& bench) { BenchLinearizeNoItersWorstCase<BitSet<16>>(16, bench); }
144-
static void LinearizeNoIters32TxWorstCase(benchmark::Bench& bench) { BenchLinearizeNoItersWorstCase<BitSet<32>>(32, bench); }
145-
static void LinearizeNoIters48TxWorstCase(benchmark::Bench& bench) { BenchLinearizeNoItersWorstCase<BitSet<48>>(48, bench); }
146-
static void LinearizeNoIters64TxWorstCase(benchmark::Bench& bench) { BenchLinearizeNoItersWorstCase<BitSet<64>>(64, bench); }
147-
static void LinearizeNoIters75TxWorstCase(benchmark::Bench& bench) { BenchLinearizeNoItersWorstCase<BitSet<75>>(75, bench); }
148-
static void LinearizeNoIters99TxWorstCase(benchmark::Bench& bench) { BenchLinearizeNoItersWorstCase<BitSet<99>>(99, bench); }
181+
static void LinearizeNoIters16TxWorstCaseAnc(benchmark::Bench& bench) { BenchLinearizeNoItersWorstCaseAnc<BitSet<16>>(16, bench); }
182+
static void LinearizeNoIters32TxWorstCaseAnc(benchmark::Bench& bench) { BenchLinearizeNoItersWorstCaseAnc<BitSet<32>>(32, bench); }
183+
static void LinearizeNoIters48TxWorstCaseAnc(benchmark::Bench& bench) { BenchLinearizeNoItersWorstCaseAnc<BitSet<48>>(48, bench); }
184+
static void LinearizeNoIters64TxWorstCaseAnc(benchmark::Bench& bench) { BenchLinearizeNoItersWorstCaseAnc<BitSet<64>>(64, bench); }
185+
static void LinearizeNoIters75TxWorstCaseAnc(benchmark::Bench& bench) { BenchLinearizeNoItersWorstCaseAnc<BitSet<75>>(75, bench); }
186+
static void LinearizeNoIters99TxWorstCaseAnc(benchmark::Bench& bench) { BenchLinearizeNoItersWorstCaseAnc<BitSet<99>>(99, bench); }
187+
188+
static void LinearizeNoIters16TxWorstCaseLIMO(benchmark::Bench& bench) { BenchLinearizeNoItersWorstCaseLIMO<BitSet<16>>(16, bench); }
189+
static void LinearizeNoIters32TxWorstCaseLIMO(benchmark::Bench& bench) { BenchLinearizeNoItersWorstCaseLIMO<BitSet<32>>(32, bench); }
190+
static void LinearizeNoIters48TxWorstCaseLIMO(benchmark::Bench& bench) { BenchLinearizeNoItersWorstCaseLIMO<BitSet<48>>(48, bench); }
191+
static void LinearizeNoIters64TxWorstCaseLIMO(benchmark::Bench& bench) { BenchLinearizeNoItersWorstCaseLIMO<BitSet<64>>(64, bench); }
192+
static void LinearizeNoIters75TxWorstCaseLIMO(benchmark::Bench& bench) { BenchLinearizeNoItersWorstCaseLIMO<BitSet<75>>(75, bench); }
193+
static void LinearizeNoIters99TxWorstCaseLIMO(benchmark::Bench& bench) { BenchLinearizeNoItersWorstCaseLIMO<BitSet<99>>(99, bench); }
149194

150195
BENCHMARK(LinearizePerIter16TxWorstCase, benchmark::PriorityLevel::HIGH);
151196
BENCHMARK(LinearizePerIter32TxWorstCase, benchmark::PriorityLevel::HIGH);
@@ -154,9 +199,16 @@ BENCHMARK(LinearizePerIter64TxWorstCase, benchmark::PriorityLevel::HIGH);
154199
BENCHMARK(LinearizePerIter75TxWorstCase, benchmark::PriorityLevel::HIGH);
155200
BENCHMARK(LinearizePerIter99TxWorstCase, benchmark::PriorityLevel::HIGH);
156201

157-
BENCHMARK(LinearizeNoIters16TxWorstCase, benchmark::PriorityLevel::HIGH);
158-
BENCHMARK(LinearizeNoIters32TxWorstCase, benchmark::PriorityLevel::HIGH);
159-
BENCHMARK(LinearizeNoIters48TxWorstCase, benchmark::PriorityLevel::HIGH);
160-
BENCHMARK(LinearizeNoIters64TxWorstCase, benchmark::PriorityLevel::HIGH);
161-
BENCHMARK(LinearizeNoIters75TxWorstCase, benchmark::PriorityLevel::HIGH);
162-
BENCHMARK(LinearizeNoIters99TxWorstCase, benchmark::PriorityLevel::HIGH);
202+
BENCHMARK(LinearizeNoIters16TxWorstCaseAnc, benchmark::PriorityLevel::HIGH);
203+
BENCHMARK(LinearizeNoIters32TxWorstCaseAnc, benchmark::PriorityLevel::HIGH);
204+
BENCHMARK(LinearizeNoIters48TxWorstCaseAnc, benchmark::PriorityLevel::HIGH);
205+
BENCHMARK(LinearizeNoIters64TxWorstCaseAnc, benchmark::PriorityLevel::HIGH);
206+
BENCHMARK(LinearizeNoIters75TxWorstCaseAnc, benchmark::PriorityLevel::HIGH);
207+
BENCHMARK(LinearizeNoIters99TxWorstCaseAnc, benchmark::PriorityLevel::HIGH);
208+
209+
BENCHMARK(LinearizeNoIters16TxWorstCaseLIMO, benchmark::PriorityLevel::HIGH);
210+
BENCHMARK(LinearizeNoIters32TxWorstCaseLIMO, benchmark::PriorityLevel::HIGH);
211+
BENCHMARK(LinearizeNoIters48TxWorstCaseLIMO, benchmark::PriorityLevel::HIGH);
212+
BENCHMARK(LinearizeNoIters64TxWorstCaseLIMO, benchmark::PriorityLevel::HIGH);
213+
BENCHMARK(LinearizeNoIters75TxWorstCaseLIMO, benchmark::PriorityLevel::HIGH);
214+
BENCHMARK(LinearizeNoIters99TxWorstCaseLIMO, benchmark::PriorityLevel::HIGH);

0 commit comments

Comments
 (0)