Skip to content

Commit 73cdf52

Browse files
committed
Use nested hashes for edge storage in ChangeSet
... to avoid O(n^2) lookups.
1 parent a8a857d commit 73cdf52

1 file changed

Lines changed: 15 additions & 8 deletions

File tree

lib/typeprof/core/graph/change_set.rb

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ def initialize(node, target)
66
@new_vertexes = {}
77
@covariant_types = {}
88
@contravariant_types = {}
9-
@edges = []
10-
@new_edges = []
9+
@edges = {}
10+
@new_edges = {}
1111
@boxes = {}
1212
@new_boxes = {}
1313
@diagnostics = []
@@ -64,7 +64,7 @@ def new_contravariant_vertex(genv, sig_type_node)
6464
end
6565

6666
def add_edge(genv, src, dst)
67-
@new_edges << [src, dst]
67+
(@new_edges[src] ||= {})[dst] = true
6868
end
6969

7070
# TODO: if an edge is removed during one analysis, we may need to remove sub-boxes?
@@ -160,14 +160,21 @@ def add_depended_superclass(mod)
160160
end
161161

162162
def reinstall(genv)
163-
@new_edges.uniq!
164-
@new_edges.each do |src, dst|
165-
src.add_edge(genv, dst) unless @edges.include?([src, dst])
163+
# Edges stored as nested hashes: {src => {dst => true}}
164+
@new_edges.each do |src, new_dsts|
165+
old_dsts = @edges[src]
166+
new_dsts.each_key do |dst|
167+
src.add_edge(genv, dst) unless old_dsts&.key?(dst)
168+
end
166169
end
167-
@edges.each do |src, dst|
168-
src.remove_edge(genv, dst) unless @new_edges.include?([src, dst])
170+
@edges.each do |src, old_dsts|
171+
new_dsts = @new_edges[src]
172+
old_dsts.each_key do |dst|
173+
src.remove_edge(genv, dst) unless new_dsts&.key?(dst)
174+
end
169175
end
170176
@edges, @new_edges = @new_edges, @edges
177+
@new_edges.each_value(&:clear)
171178
@new_edges.clear
172179

173180
@boxes.each do |key, box|

0 commit comments

Comments
 (0)