Compare commits

...

1 Commits

Author SHA1 Message Date
Dylan Thacker-Smith
d7234cb346 Benchmark marshal load and render against parse and render. 2014-09-12 09:46:30 -04:00
3 changed files with 53 additions and 42 deletions

View File

@@ -1,17 +1,14 @@
require 'benchmark/ips' require 'benchmark'
require File.dirname(__FILE__) + '/theme_runner' require File.dirname(__FILE__) + '/theme_runner'
Liquid::Template.error_mode = ARGV.first.to_sym if ARGV.first Liquid::Template.error_mode = ARGV.first.to_sym if ARGV.first
profiler = ThemeRunner.new profiler = ThemeRunner.new
Benchmark.ips do |x| N = 100
x.time = 60 Benchmark.bmbm do |x|
x.warmup = 5 x.report("parse:") { N.times { profiler.parse } }
x.report("marshal load:") { N.times { profiler.marshal_load } }
puts x.report("render:") { N.times { profiler.render } }
puts "Running benchmark for #{x.time} seconds (with #{x.warmup} seconds warmup)." x.report("marshal load & render:") { N.times { profiler.load_and_render } }
puts x.report("parse & render:") { N.times { profiler.parse_and_render } }
x.report("parse:") { profiler.compile }
x.report("parse & run:") { profiler.run }
end end

View File

@@ -3,13 +3,13 @@ require File.dirname(__FILE__) + '/theme_runner'
Liquid::Template.error_mode = ARGV.first.to_sym if ARGV.first Liquid::Template.error_mode = ARGV.first.to_sym if ARGV.first
profiler = ThemeRunner.new profiler = ThemeRunner.new
profiler.run profiler.parse_and_render
[:cpu, :object].each do |profile_type| [:cpu, :object].each do |profile_type|
puts "Profiling in #{profile_type.to_s} mode..." puts "Profiling in #{profile_type.to_s} mode..."
results = StackProf.run(mode: profile_type) do results = StackProf.run(mode: profile_type) do
100.times do 100.times do
profiler.run profiler.parse_and_render
end end
end end
StackProf::Report.new(results).print_text(false, 20) StackProf::Report.new(results).print_text(false, 20)

View File

@@ -32,45 +32,59 @@ class ThemeRunner
[File.read(test), (File.file?(theme_path) ? File.read(theme_path) : nil), test] [File.read(test), (File.file?(theme_path) ? File.read(theme_path) : nil), test]
end.compact end.compact
end @parsed = @tests.map do |liquid, layout, template_name|
[Liquid::Template.parse(liquid), Liquid::Template.parse(layout), template_name]
def compile end
# Dup assigns because will make some changes to them @marshaled = @parsed.map do |liquid, layout, template_name|
[Marshal.dump(liquid), Marshal.dump(layout), template_name]
@tests.each do |liquid, layout, template_name|
tmpl = Liquid::Template.new
tmpl.parse(liquid)
tmpl = Liquid::Template.new
tmpl.parse(layout)
end end
end end
def run def parse
@tests.each do |liquid, layout, template_name|
Liquid::Template.parse(liquid)
Liquid::Template.parse(layout)
end
end
def marshal_load
@marshaled.each do |liquid, layout, template_name|
Marshal.load(liquid)
Marshal.load(layout)
end
end
def render
@parsed.each do |liquid, layout, template_name|
render_once(liquid, layout, template_name)
end
end
def load_and_render
@marshaled.each do |liquid, layout, template_name|
render_once(Marshal.load(liquid), Marshal.load(layout), template_name)
end
end
def parse_and_render
@tests.each do |liquid, layout, template_name|
render_once(Liquid::Template.parse(liquid), Liquid::Template.parse(layout), template_name)
end
end
def render_once(template, layout, template_name)
# Dup assigns because will make some changes to them # Dup assigns because will make some changes to them
assigns = Database.tables.dup assigns = Database.tables.dup
@tests.each do |liquid, layout, template_name| assigns['page_title'] = 'Page title'
assigns['template'] = File.basename(template_name, File.extname(template_name))
template.registers[:file_system] = ThemeRunner::FileSystem.new(File.dirname(template_name))
# Compute page_tempalte outside of profiler run, uninteresting to profiler content_for_layout = template.render!(assigns)
page_template = File.basename(template_name, File.extname(template_name))
compile_and_render(liquid, layout, assigns, page_template, template_name)
end
end
def compile_and_render(template, layout, assigns, page_template, template_file)
tmpl = Liquid::Template.new
tmpl.assigns['page_title'] = 'Page title'
tmpl.assigns['template'] = page_template
tmpl.registers[:file_system] = ThemeRunner::FileSystem.new(File.dirname(template_file))
content_for_layout = tmpl.parse(template).render!(assigns)
if layout if layout
assigns['content_for_layout'] = content_for_layout assigns['content_for_layout'] = content_for_layout
tmpl.parse(layout).render!(assigns) layout.render!(assigns)
else else
content_for_layout content_for_layout
end end