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.

Reply via email to