Skip to content

Commit 4aaa806

Browse files
committed
askrene: optimize, by calling tal_count less.
I like the clarity, but this is a hot path. Fortunately these arrays have very well defined lengths. Before: 5.81 seconds After: 1.06 seconds Signed-off-by: Rusty Russell <[email protected]>
1 parent a6abf7f commit 4aaa806

File tree

1 file changed

+14
-17
lines changed

1 file changed

+14
-17
lines changed

plugins/askrene/mcf.c

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,7 @@ static s64 get_arc_flow(
392392
static u32 arc_tail(const struct linear_network *linear_network,
393393
const struct arc arc)
394394
{
395-
assert(arc.idx < tal_count(linear_network->arc_tail_node));
395+
assert(arc.idx < linear_network->max_num_arcs);
396396
return linear_network->arc_tail_node[ arc.idx ];
397397
}
398398
/* Helper function.
@@ -401,7 +401,7 @@ static u32 arc_head(const struct linear_network *linear_network,
401401
const struct arc arc)
402402
{
403403
const struct arc dual = arc_dual(arc);
404-
assert(dual.idx < tal_count(linear_network->arc_tail_node));
404+
assert(dual.idx < linear_network->max_num_arcs);
405405
return linear_network->arc_tail_node[dual.idx];
406406
}
407407

@@ -412,7 +412,7 @@ static struct arc node_adjacency_begin(
412412
const struct linear_network * linear_network,
413413
const u32 node)
414414
{
415-
assert(node < tal_count(linear_network->node_adjacency_first_arc));
415+
assert(node < linear_network->max_num_nodes);
416416
return linear_network->node_adjacency_first_arc[node];
417417
}
418418

@@ -429,7 +429,7 @@ static struct arc node_adjacency_next(
429429
const struct linear_network *linear_network,
430430
const struct arc arc)
431431
{
432-
assert(arc.idx < tal_count(linear_network->node_adjacency_next_arc));
432+
assert(arc.idx < linear_network->max_num_arcs);
433433
return linear_network->node_adjacency_next_arc[arc.idx];
434434
}
435435

@@ -540,16 +540,13 @@ static void linear_network_add_adjacenct_arc(
540540
const u32 node_idx,
541541
const struct arc arc)
542542
{
543-
assert(arc.idx < tal_count(linear_network->arc_tail_node));
543+
assert(arc.idx < linear_network->max_num_arcs);
544544
linear_network->arc_tail_node[arc.idx] = node_idx;
545545

546-
assert(node_idx < tal_count(linear_network->node_adjacency_first_arc));
546+
assert(node_idx < linear_network->max_num_nodes);
547547
const struct arc first_arc = linear_network->node_adjacency_first_arc[node_idx];
548548

549-
assert(arc.idx < tal_count(linear_network->node_adjacency_next_arc));
550549
linear_network->node_adjacency_next_arc[arc.idx]=first_arc;
551-
552-
assert(node_idx < tal_count(linear_network->node_adjacency_first_arc));
553550
linear_network->node_adjacency_first_arc[node_idx]=arc;
554551
}
555552

@@ -596,23 +593,23 @@ init_linear_network(const tal_t *ctx, const struct pay_parameters *params)
596593
linear_network->max_num_nodes = max_num_nodes;
597594

598595
linear_network->arc_tail_node = tal_arr(linear_network,u32,max_num_arcs);
599-
for(size_t i=0;i<tal_count(linear_network->arc_tail_node);++i)
596+
for(size_t i=0;i<max_num_arcs;++i)
600597
linear_network->arc_tail_node[i]=INVALID_INDEX;
601598

602599
linear_network->node_adjacency_next_arc = tal_arr(linear_network,struct arc,max_num_arcs);
603-
for(size_t i=0;i<tal_count(linear_network->node_adjacency_next_arc);++i)
600+
for(size_t i=0;i<max_num_arcs;++i)
604601
linear_network->node_adjacency_next_arc[i].idx=INVALID_INDEX;
605602

606603
linear_network->node_adjacency_first_arc = tal_arr(linear_network,struct arc,max_num_nodes);
607-
for(size_t i=0;i<tal_count(linear_network->node_adjacency_first_arc);++i)
604+
for(size_t i=0;i<max_num_nodes;++i)
608605
linear_network->node_adjacency_first_arc[i].idx=INVALID_INDEX;
609606

610607
linear_network->arc_prob_cost = tal_arr(linear_network,s64,max_num_arcs);
611-
for(size_t i=0;i<tal_count(linear_network->arc_prob_cost);++i)
608+
for(size_t i=0;i<max_num_arcs;++i)
612609
linear_network->arc_prob_cost[i]=INFINITE;
613610

614611
linear_network->arc_fee_cost = tal_arr(linear_network,s64,max_num_arcs);
615-
for(size_t i=0;i<tal_count(linear_network->arc_fee_cost);++i)
612+
for(size_t i=0;i<max_num_arcs;++i)
616613
linear_network->arc_fee_cost[i]=INFINITE;
617614

618615
linear_network->capacity = tal_arrz(linear_network,s64,max_num_arcs);
@@ -699,9 +696,9 @@ find_admissible_path(const struct linear_network *linear_network,
699696
bool target_found = false;
700697
/* Simple linear queue of node indexes */
701698
u32 *queue = tal_arr(tmpctx, u32, linear_network->max_num_arcs);
702-
size_t qstart, qend;
699+
size_t qstart, qend, prev_len = tal_count(prev);
703700

704-
for(size_t i=0;i<tal_count(prev);++i)
701+
for(size_t i=0;i<prev_len;++i)
705702
prev[i].idx=INVALID_INDEX;
706703

707704
// The graph is dense, and the farthest node is just a few hops away,
@@ -729,7 +726,7 @@ find_admissible_path(const struct linear_network *linear_network,
729726

730727
u32 next = arc_head(linear_network,arc);
731728

732-
assert(next < tal_count(prev));
729+
assert(next < prev_len);
733730

734731
// if that node has been seen previously
735732
if(prev[next].idx!=INVALID_INDEX)

0 commit comments

Comments
 (0)