Skip to content

Commit

Permalink
perf: remove several rebuild-related list creations
Browse files Browse the repository at this point in the history
  • Loading branch information
GregoryConrad committed Nov 30, 2023
1 parent 36ebfd2 commit be1620c
Showing 1 changed file with 10 additions and 9 deletions.
19 changes: 10 additions & 9 deletions packages/rearch/lib/src/node.dart
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,12 @@ abstract class DataflowGraphNode implements Disposable {
if (!selfChanged) return;

// Build or garbage collect (dispose) all remaining nodes
// (We use skip(1) to avoid building this node twice)
final buildOrder = _createBuildOrder().skip(1).toList();
final disposableNodes = _getDisposableNodesFromBuildOrder(buildOrder);
// (We use removeLast() to avoid building this node twice)
final buildOrderStack = _createBuildOrderStack()..removeLast();
final disposableNodes =
_getDisposableNodesFromBuildOrderStack(buildOrderStack);
final changedNodes = {this};
for (final node in buildOrder) {
for (final node in buildOrderStack.reversed) {
final haveDepsChanged = node._dependencies.any(changedNodes.contains);
if (!haveDepsChanged) continue;

Expand All @@ -58,7 +59,7 @@ abstract class DataflowGraphNode implements Disposable {
}
}

List<DataflowGraphNode> _createBuildOrder() {
List<DataflowGraphNode> _createBuildOrderStack() {
// We need some more information alongside of each node
// in order to do the topological sort:
// - False is for the first visit, which adds all deps to be visited,
Expand All @@ -84,15 +85,15 @@ abstract class DataflowGraphNode implements Disposable {
}
}

return buildOrderStack.reversed.toList();
return buildOrderStack;
}

static Set<DataflowGraphNode> _getDisposableNodesFromBuildOrder(
List<DataflowGraphNode> buildOrder,
static Set<DataflowGraphNode> _getDisposableNodesFromBuildOrderStack(
List<DataflowGraphNode> buildOrderStack,
) {
final disposable = <DataflowGraphNode>{};

buildOrder.reversed.where((node) {
buildOrderStack.where((node) {
final dependentsAllDisposable =
node._dependents.every(disposable.contains);
return node.isIdempotent && dependentsAllDisposable;
Expand Down

0 comments on commit be1620c

Please sign in to comment.