@@ -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).
3146template <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 */
122140template <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
136174static void LinearizePerIter16TxWorstCase (benchmark::Bench& bench) { BenchLinearizePerIterWorstCase<BitSet<16 >>(16 , bench); }
@@ -140,12 +178,19 @@ static void LinearizePerIter64TxWorstCase(benchmark::Bench& bench) { BenchLinear
140178static void LinearizePerIter75TxWorstCase (benchmark::Bench& bench) { BenchLinearizePerIterWorstCase<BitSet<75 >>(75 , bench); }
141179static 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
150195BENCHMARK (LinearizePerIter16TxWorstCase, benchmark::PriorityLevel::HIGH);
151196BENCHMARK (LinearizePerIter32TxWorstCase, benchmark::PriorityLevel::HIGH);
@@ -154,9 +199,16 @@ BENCHMARK(LinearizePerIter64TxWorstCase, benchmark::PriorityLevel::HIGH);
154199BENCHMARK (LinearizePerIter75TxWorstCase, benchmark::PriorityLevel::HIGH);
155200BENCHMARK (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