unevaluated_resources was a performance bottleneck and was doing a great deal of unneeded work, such as searching for the type of evaluated resources before ignoring them because only unevaluated resources were wanted.
This patch is behaviour neutral but gives a 2-3x speedup for compiles with many defined resources. Signed-off-by: Markus Roberts <[email protected]> --- lib/puppet/parser/compiler.rb | 23 +++-------------------- lib/puppet/parser/resource.rb | 9 +++------ lib/puppet/resource.rb | 2 +- lib/puppet/type.rb | 8 ++------ spec/unit/parser/compiler_spec.rb | 2 +- 5 files changed, 10 insertions(+), 34 deletions(-) diff --git a/lib/puppet/parser/compiler.rb b/lib/puppet/parser/compiler.rb index 8598072..a901c0d 100644 --- a/lib/puppet/parser/compiler.rb +++ b/lib/puppet/parser/compiler.rb @@ -251,19 +251,7 @@ class Puppet::Parser::Compiler # evaluate_generators loop. def evaluate_definitions exceptwrap do - if ary = unevaluated_resources - evaluated = false - ary.each do |resource| - if not resource.virtual? - resource.evaluate - evaluated = true - end - end - # If we evaluated, let the loop know. - return evaluated - else - return false - end + !unevaluated_resources.each { |resource| resource.evaluate }.empty? end end @@ -482,12 +470,7 @@ class Puppet::Parser::Compiler # Return an array of all of the unevaluated resources. These will be definitions, # which need to get evaluated into native resources. def unevaluated_resources - ary = resources.reject { |resource| resource.builtin? or resource.evaluated? } - - if ary.empty? - return nil - else - return ary - end + # The order of these is significant for speed due to short-circuting + resources.reject { |resource| resource.evaluated? or resource.virtual? or resource.builtin_type? } end end diff --git a/lib/puppet/parser/resource.rb b/lib/puppet/parser/resource.rb index 3cccf4f..c956a11 100644 --- a/lib/puppet/parser/resource.rb +++ b/lib/puppet/parser/resource.rb @@ -32,12 +32,9 @@ class Puppet::Parser::Resource < Puppet::Resource end # Set up some boolean test methods - [:translated, :override, :evaluated].each do |method| - newmeth = (method.to_s + "?").intern - define_method(newmeth) do - self.send(method) - end - end + def translated?; !...@translated; end + def override?; !...@override; end + def evaluated?; !...@evaluated; end def [](param) param = symbolize(param) diff --git a/lib/puppet/resource.rb b/lib/puppet/resource.rb index d68e0ee..55874ae 100644 --- a/lib/puppet/resource.rb +++ b/lib/puppet/resource.rb @@ -199,7 +199,7 @@ class Puppet::Resource end def resource_type - case type + @resource_type ||= case type when "Class"; find_hostclass(title) when "Node"; find_node(title) else diff --git a/lib/puppet/type.rb b/lib/puppet/type.rb index 627271f..8807110 100644 --- a/lib/puppet/type.rb +++ b/lib/puppet/type.rb @@ -1874,12 +1874,8 @@ class Type self.to_trans.to_resource end - %w{exported virtual}.each do |m| - define_method(m+"?") do - self.send(m) - end - end - + def virtual?; !...@virtual; end + def exported?; !...@exported; end end end diff --git a/spec/unit/parser/compiler_spec.rb b/spec/unit/parser/compiler_spec.rb index a3fe56c..e8c06dd 100755 --- a/spec/unit/parser/compiler_spec.rb +++ b/spec/unit/parser/compiler_spec.rb @@ -23,7 +23,7 @@ class CompilerTestResource @evaluated end - def builtin? + def builtin_type? @builtin end -- 1.6.4 -- You received this message because you are subscribed to the Google Groups "Puppet Developers" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/puppet-dev?hl=en.
