@@ -26,6 +26,21 @@ DepGraph<SetType> MakeLinearGraph(ClusterIndex ntx)
26
26
return depgraph;
27
27
}
28
28
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
+
29
44
// Construct a difficult graph. These need at least sqrt(2^(n-1)) iterations in the best
30
45
// known algorithms (purely empirically determined).
31
46
template <typename SetType>
@@ -114,13 +129,16 @@ void BenchLinearizePerIterWorstCase(ClusterIndex ntx, benchmark::Bench& bench)
114
129
* Its goal is measuring how much time linearization may take without any search iterations.
115
130
*
116
131
* 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
118
133
* take no more than roughly N+m*P time. This may however be an overestimate, as the worst cases
119
134
* do not coincide (the ones that are worst for linearization without any search happen to be ones
120
135
* that do not need many search iterations).
136
+ *
137
+ * This benchmark exercises a worst case for AncestorCandidateFinder, but for which improvement is
138
+ * cheap.
121
139
*/
122
140
template <typename SetType>
123
- void BenchLinearizeNoItersWorstCase (ClusterIndex ntx, benchmark::Bench& bench)
141
+ void BenchLinearizeNoItersWorstCaseAnc (ClusterIndex ntx, benchmark::Bench& bench)
124
142
{
125
143
const auto depgraph = MakeLinearGraph<SetType>(ntx);
126
144
uint64_t rng_seed = 0 ;
@@ -131,6 +149,26 @@ void BenchLinearizeNoItersWorstCase(ClusterIndex ntx, benchmark::Bench& bench)
131
149
});
132
150
}
133
151
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
+
134
172
} // namespace
135
173
136
174
static void LinearizePerIter16TxWorstCase (benchmark::Bench& bench) { BenchLinearizePerIterWorstCase<BitSet<16 >>(16 , bench); }
@@ -140,12 +178,19 @@ static void LinearizePerIter64TxWorstCase(benchmark::Bench& bench) { BenchLinear
140
178
static void LinearizePerIter75TxWorstCase (benchmark::Bench& bench) { BenchLinearizePerIterWorstCase<BitSet<75 >>(75 , bench); }
141
179
static void LinearizePerIter99TxWorstCase (benchmark::Bench& bench) { BenchLinearizePerIterWorstCase<BitSet<99 >>(99 , bench); }
142
180
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); }
149
194
150
195
BENCHMARK (LinearizePerIter16TxWorstCase, benchmark::PriorityLevel::HIGH);
151
196
BENCHMARK (LinearizePerIter32TxWorstCase, benchmark::PriorityLevel::HIGH);
@@ -154,9 +199,16 @@ BENCHMARK(LinearizePerIter64TxWorstCase, benchmark::PriorityLevel::HIGH);
154
199
BENCHMARK (LinearizePerIter75TxWorstCase, benchmark::PriorityLevel::HIGH);
155
200
BENCHMARK (LinearizePerIter99TxWorstCase, benchmark::PriorityLevel::HIGH);
156
201
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