From 99563efd17ef649920bced97481d5f1f1d6e3774 Mon Sep 17 00:00:00 2001 From: Eric Amorde Date: Sat, 5 Mar 2022 15:38:00 -0800 Subject: [PATCH] Optimize push_state_for_requirements by removing N^2 lookup --- lib/molinillo/resolution.rb | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/molinillo/resolution.rb b/lib/molinillo/resolution.rb index 455476c..9947dba 100644 --- a/lib/molinillo/resolution.rb +++ b/lib/molinillo/resolution.rb @@ -155,6 +155,7 @@ def initialize(specification_provider, resolver_ui, requested, base) @original_requested = requested @base = base @states = [] + @states_by_requirement = {} @iteration_counter = 0 @parents_of = Hash.new { |h, k| h[k] = [] } end @@ -200,6 +201,10 @@ def resolve attr_accessor :states private :states + # @return [Hash{Object => ResolutionState}] states keyed by their requirement + attr_accessor :states_by_requirement + private :states + private # Sets up the resolution process @@ -586,7 +591,7 @@ def requirement_for_existing_name(name) # `requirement`. def find_state_for(requirement) return nil unless requirement - states.find { |i| requirement == i.requirement } + states_by_requirement[requirement] end # @param [Object] underlying_error @@ -755,7 +760,7 @@ def push_state_for_requirements(new_requirements, requires_sort = true, new_acti new_requirement = nil loop do new_requirement = new_requirements.shift - break if new_requirement.nil? || states.none? { |s| s.requirement == new_requirement } + break if new_requirement.nil? || states_by_requirement[new_requirement].nil? end new_name = new_requirement ? name_for(new_requirement) : ''.freeze possibilities = possibilities_for_requirement(new_requirement) @@ -831,6 +836,7 @@ def handle_missing_or_push_dependency_state(state) state.activated.detach_vertex_named(state.name) push_state_for_requirements(state.requirements.dup, false, state.activated) else + states_by_requirement[state.requirement] = state states.push(state).tap { activated.tag(state) } end end