From 0ab40b039bf7b7882a31ab187916bc2dc5a8ae7c Mon Sep 17 00:00:00 2001 From: Yehuda Katz Date: Sat, 8 Aug 2009 23:43:45 -0300 Subject: [PATCH] Went from 25% slower partials (vs. 2.3) to 10% faster. More to come. --- actionpack/examples/minimal.rb | 19 ++++++++++++++----- actionpack/lib/action_view/render/partials.rb | 10 +++++++--- .../lib/action_view/template/template.rb | 4 ++-- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/actionpack/examples/minimal.rb b/actionpack/examples/minimal.rb index cbfe6a427a..bf36f518bd 100644 --- a/actionpack/examples/minimal.rb +++ b/actionpack/examples/minimal.rb @@ -70,9 +70,18 @@ class HttpPostController < ActionController::Metal end end -(ENV["M"] || 1).to_i.times do - Runner.run(BasePostController.action(:partial), N, 'partial') - Runner.run(BasePostController.action(:many_partials), N, 'many_partials') - Runner.run(BasePostController.action(:partial_collection), N, 'collection') - Runner.run(BasePostController.action(:show_template), N, 'template') +unless ENV["PROFILE"] + (ENV["M"] || 1).to_i.times do + Runner.run(BasePostController.action(:partial), N, 'partial') + Runner.run(BasePostController.action(:many_partials), N, 'many_partials') + Runner.run(BasePostController.action(:partial_collection), N, 'collection') + Runner.run(BasePostController.action(:show_template), N, 'template') + end +else + require "ruby-prof" + RubyProf.start + Runner.run(BasePostController.action(:many_partials), N, 'partial') + result = RubyProf.stop + printer = RubyProf::CallStackPrinter.new(result) + printer.print(File.open("output.html", "w"), :min_percent => 2) end \ No newline at end of file diff --git a/actionpack/lib/action_view/render/partials.rb b/actionpack/lib/action_view/render/partials.rb index e7d03c81e8..7a8c943b05 100644 --- a/actionpack/lib/action_view/render/partials.rb +++ b/actionpack/lib/action_view/render/partials.rb @@ -177,6 +177,10 @@ module ActionView @partial_names ||= Hash.new {|h,k| h[k] = ActiveSupport::ConcurrentHash.new } end + def self.formats + @formats ||= Hash.new {|h,k| h[k] = Hash.new {|h,k| h[k] = {}}} + end + def initialize(view_context, options, block) partial = options[:partial] @@ -187,8 +191,8 @@ module ActionView # Set up some instance variables to speed up memoizing @partial_names = self.class.partial_names[@view.controller.class] - @templates = Hash.new {|h,k| h[k] = {}} - @formats_hash = view_context.formats.hash + @templates = self.class.formats + @details_hash = [view_context.formats, I18n.locale].hash # Set up the object and path @object = partial.is_a?(String) ? options[:object] : partial @@ -248,7 +252,7 @@ module ActionView def find_template(path = @path) return if !path - @templates[path][@formats_hash] ||= begin + @templates[@details_hash][path][@view.controller_path] ||= begin prefix = @view.controller.controller_path unless path.include?(?/) @view.find(path, {:formats => @view.formats}, prefix, true) end diff --git a/actionpack/lib/action_view/template/template.rb b/actionpack/lib/action_view/template/template.rb index 4145045e2d..abe310b758 100644 --- a/actionpack/lib/action_view/template/template.rb +++ b/actionpack/lib/action_view/template/template.rb @@ -30,12 +30,12 @@ module ActionView # TODO: Figure out how to abstract this def variable_name - identifier[%r'_?(\w+)(\.\w+)*$', 1].to_sym + @variable_name ||= identifier[%r'_?(\w+)(\.\w+)*$', 1].to_sym end # TODO: Figure out how to abstract this def counter_name - "#{variable_name}_counter".to_sym + @counter_name ||= "#{variable_name}_counter".to_sym end # TODO: kill hax