From 65cf3f1de18272454ca8eff1f5e835208e540680 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Wed, 6 Jan 2021 16:00:43 -0500 Subject: [PATCH] Implement benchmarks for serialization --- performance/benchmark.rb | 5 +++++ performance/theme_runner.rb | 45 ++++++++++++++++++++++++++++++++++--- 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/performance/benchmark.rb b/performance/benchmark.rb index 8bf231340..41fed78c8 100644 --- a/performance/benchmark.rb +++ b/performance/benchmark.rb @@ -17,4 +17,9 @@ x.report("parse:") { profiler.compile } x.report("render:") { profiler.render } x.report("parse & render:") { profiler.run } + + if profiler.serialization_enabled? + x.report("deserialize:") { profiler.deserialize } + x.report("deserialize & render:") { profiler.deserialize_and_render } + end end diff --git a/performance/theme_runner.rb b/performance/theme_runner.rb index d8d093661..9f399623f 100644 --- a/performance/theme_runner.rb +++ b/performance/theme_runner.rb @@ -38,6 +38,7 @@ def initialize end.compact compile_all_tests + serialize_all_tests if serialization_enabled? end # `compile` will test just the compilation portion of liquid without any templates @@ -71,12 +72,37 @@ def render end end + def serialization_enabled? + defined?(Liquid::C) && Liquid::C.enabled + end + + def deserialize + @serialized_tests.each do |test| + Liquid::Template.load(test[:tmpl]) + Liquid::Template.load(test[:layout]) + end + end + + def deserialize_and_render + @serialized_tests.each do |test| + tmpl = test[:tmpl] + assigns = test[:assigns] + layout = test[:layout] + + render_layout(Liquid::Template.load(tmpl), Liquid::Template.load(layout), assigns) + end + end + private + def render_layout(template, layout, assigns) + assigns['content_for_layout'] = template.render!(assigns) + layout&.render!(assigns) + end + def compile_and_render(template, layout, assigns, page_template, template_file) - compiled_test = compile_test(template, layout, assigns, page_template, template_file) - assigns['content_for_layout'] = compiled_test[:tmpl].render!(assigns) - compiled_test[:layout].render!(assigns) if layout + compiled_test = compile_test(template, layout, assigns, page_template, template_file) + render_layout(compiled_test[:layout], compiled_test[:tmpl], compiled_test[:assigns]) end def compile_all_tests @@ -99,6 +125,19 @@ def compile_test(template, layout, assigns, page_template, template_file) end end + def serialize_all_tests + @serialized_tests = [] + @compiled_tests.each do |test_hash| + @serialized_tests << + if test_hash[:layout] + { tmpl: test_hash[:tmpl].dump, assigns: test_hash[:assigns], layout: test_hash[:layout].dump } + else + { tmpl: test_hash[:tmpl].dump, assigns: test_hash[:assigns] } + end + end + @serialized_tests + end + # utility method with similar functionality needed in `compile_all_tests` and `run` def each_test # Dup assigns because will make some changes to them