Skip to content

Commit

Permalink
Improving Render performance (#117)
Browse files Browse the repository at this point in the history
  • Loading branch information
sebastienros committed Mar 3, 2019
1 parent 6f49f61 commit d8aff5e
Show file tree
Hide file tree
Showing 103 changed files with 769 additions and 581 deletions.
57 changes: 21 additions & 36 deletions Fluid.Benchmarks/BaseBenchmarks.cs
Original file line number Diff line number Diff line change
@@ -1,56 +1,41 @@
using System.Threading.Tasks;
using System.Collections.Generic;

namespace Fluid.Benchmarks
{
public abstract class BaseBenchmarks
{
protected const string _source1 = @"
<ul id=""products"">
protected List<Product> Products = new List<Product>(ProductCount);

protected const int ProductCount = 500;

protected const string Lorem = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum";

protected const string TextTemplate = @"
<ul id='products'>
{% for product in products %}
<li>
<h2>{{ product.name }}</h2>
Only {{ product.price | price }}
{{ product.description | prettyprint | paragraph }}
Only {{ product.price }}
{{ product.description | truncate: 15 }}
</li>
{% endfor %}
</ul>
";

protected object[] _products = new[]
public BaseBenchmarks()
{
new { name = "product 1", price = 1 },
new { name = "product 2", price = 2 },
new { name = "product 3", price = 3 },
};

protected const string _source2 = @"{{ image }}";

protected const string _source3 = @"
Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?
Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?
Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?
Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?
Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?
Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?
Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?
Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?
Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?
";

protected const string _source4 = @"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, {{ image }} eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?";


public abstract object ParseSample();

public abstract Task<string> ParseAndRenderSample();
for (int i = 0; i < ProductCount; i++)
{
var product = new Product("Name" + i, i, Lorem);
Products.Add(product);
}
}

public abstract string RenderSample();
public abstract object Parse();

public abstract object ParseLoremIpsum();
public abstract string Render();

public abstract Task<string> RenderSimpleOuput();
public abstract string ParseAndRender();

public abstract Task<string> RenderLoremSimpleOuput();
}
}
52 changes: 14 additions & 38 deletions Fluid.Benchmarks/DotLiquidBenchmarks.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using System.Threading.Tasks;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Attributes;
using DotLiquid;

namespace Fluid.Benchmarks
Expand All @@ -8,58 +7,35 @@ namespace Fluid.Benchmarks
public class DotLiquidBenchmarks : BaseBenchmarks
{

private Template _sampleTemplateDotLiquid;
private Template _dotLiquidTemplate;
private Hash _products;

public DotLiquidBenchmarks()
{
_sampleTemplateDotLiquid = Template.Parse(_source1);
_sampleTemplateDotLiquid.MakeThreadSafe();
_dotLiquidTemplate = Template.Parse(TextTemplate);
_dotLiquidTemplate.MakeThreadSafe();
_products = Hash.FromAnonymousObject(new { products = Products });
}

[Benchmark]
public override object ParseSample()
public override object Parse()
{
var template = Template.Parse(_source1);
return template;
}


[Benchmark]
public override Task<string> ParseAndRenderSample()
{
var template = Template.Parse(_source1);
return Task.FromResult(template.Render(Hash.FromAnonymousObject(new { products = _products })));
}

[Benchmark]
public override string RenderSample()
{
return _sampleTemplateDotLiquid.Render(Hash.FromAnonymousObject(new { products = _products }));
}


[Benchmark]
public override object ParseLoremIpsum()
{
var template = Template.Parse(_source3);
var template = Template.Parse(TextTemplate);
return template;
}

[Benchmark]
public override Task<string> RenderSimpleOuput()
public override string Render()
{
var template = Template.Parse(_source2);
template.Assigns.Add("image", "kitten.jpg");
return Task.FromResult(template.Render());
return _dotLiquidTemplate.Render(_products);
}

[Benchmark]
public override Task<string> RenderLoremSimpleOuput()
public override string ParseAndRender()
{
var template = Template.Parse(_source4);
template.Assigns.Add("image", "kitten.jpg");
return Task.FromResult(template.Render());
var template = Template.Parse(TextTemplate);
var products = Hash.FromAnonymousObject(new { products = Products });
return template.Render(products);
}

}
}
5 changes: 3 additions & 2 deletions Fluid.Benchmarks/Fluid.Benchmarks.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,10 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="BenchmarkDotNet" Version="0.11.3" />
<PackageReference Include="DotLiquid" Version="2.0.174" />
<PackageReference Include="BenchmarkDotNet" Version="0.11.4" />
<PackageReference Include="DotLiquid" Version="2.0.298" />
<PackageReference Include="Liquid.NET" Version="0.10.0" />
<PackageReference Include="Scriban" Version="2.0.0-alpha-005" />
</ItemGroup>

<ItemGroup>
Expand Down
57 changes: 14 additions & 43 deletions Fluid.Benchmarks/FluidBenchmarks.cs
Original file line number Diff line number Diff line change
@@ -1,69 +1,40 @@
using System.Threading.Tasks;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Attributes;

namespace Fluid.Benchmarks
{
[MemoryDiagnoser]
public class FluidBenchmarks : BaseBenchmarks
{
private FluidTemplate _sampleTemplateFluid;
private FluidTemplate _fluidTemplate;
private TemplateContext _context;

public FluidBenchmarks()
{
FluidTemplate.TryParse(_source1, out _sampleTemplateFluid, out var messages);

FluidTemplate.TryParse(TextTemplate, out _fluidTemplate, out var errors);
_context = new TemplateContext().SetValue("products", Products);
}

[Benchmark]
public override object ParseSample()
public override object Parse()
{
FluidTemplate.TryParse(_source1, out var template, out var messages);
FluidTemplate.TryParse(TextTemplate, false, out var template, out var errors);
return template;
}

[Benchmark]
public override Task<string> ParseAndRenderSample()
public override string Render()
{
var context = new TemplateContext();
context.SetValue("products", _products);

FluidTemplate.TryParse(_source1, out var template, out var messages);
return template.RenderAsync(context);
return _fluidTemplate.Render(_context);
}

[Benchmark]
public override string RenderSample()
public override string ParseAndRender()
{
var context = new TemplateContext();
context.SetValue("products", _products);

return _sampleTemplateFluid.Render(context);
}
FluidTemplate.TryParse(TextTemplate, false, out var template, out var errors);
var context = new TemplateContext()
.SetValue("products", Products);

[Benchmark]
public override object ParseLoremIpsum()
{
FluidTemplate.TryParse(_source3, out var template, out var messages);
return template;
return template.Render(context);
}

[Benchmark]
public override Task<string> RenderSimpleOuput()
{
FluidTemplate.TryParse(_source2, out var template, out var messages);
var context = new TemplateContext();
context.SetValue("image", "kitten.jpg");
return template.RenderAsync(context);
}

[Benchmark]
public override Task<string> RenderLoremSimpleOuput()
{
FluidTemplate.TryParse(_source4, out var template, out var messages);
var context = new TemplateContext();
context.SetValue("image", "kitten.jpg");
return template.RenderAsync(context);
}

}
}
57 changes: 17 additions & 40 deletions Fluid.Benchmarks/LiquidNetBenchmarks.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using System.Threading.Tasks;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Attributes;
using Liquid.NET;
using Liquid.NET.Constants;
using Liquid.NET.Utils;
Expand All @@ -9,60 +8,38 @@ namespace Fluid.Benchmarks
[MemoryDiagnoser]
public class LiquidNetBenchmarks : BaseBenchmarks
{
private LiquidParsingResult _sampleTemplateLiquidNet;
private LiquidParsingResult _liquidNetTemplate;
private Option<ILiquidValue> _products;
private Liquid.NET.TemplateContext _context;

public LiquidNetBenchmarks()
{
_sampleTemplateLiquidNet = LiquidTemplate.Create(_source1);

}


[Benchmark]
public override object ParseSample()
{
return LiquidTemplate.Create(_source1);
}

[Benchmark]
public override Task<string> ParseAndRenderSample()
{
var context = new Liquid.NET.TemplateContext();
context.DefineLocalVariable("products", _products.ToLiquid());
var parsingResult = LiquidTemplate.Create(_source1);
return Task.FromResult(parsingResult.LiquidTemplate.Render(context).Result);
_liquidNetTemplate = LiquidTemplate.Create(TextTemplate);
_products = Products.ToLiquid();
_context = new Liquid.NET.TemplateContext();
_context.DefineLocalVariable("products", _products);
}

[Benchmark]
public override string RenderSample()
public override object Parse()
{
var context = new Liquid.NET.TemplateContext();
context.DefineLocalVariable("products", _products.ToLiquid());
return _sampleTemplateLiquidNet.LiquidTemplate.Render(context).Result;
return LiquidTemplate.Create(TextTemplate);
}

[Benchmark]
public override object ParseLoremIpsum()
public override string Render()
{
return LiquidTemplate.Create(_source3);
return _liquidNetTemplate.LiquidTemplate.Render(_context).Result;
}

[Benchmark]
public override Task<string> RenderSimpleOuput()
{
var context = new Liquid.NET.TemplateContext();
context.DefineLocalVariable("image", LiquidString.Create("kitten.jpg"));
var parsingResult = LiquidTemplate.Create(_source2);
return Task.FromResult(parsingResult.LiquidTemplate.Render(context).Result);
}

[Benchmark]
public override Task<string> RenderLoremSimpleOuput()
public override string ParseAndRender()
{
var template = LiquidTemplate.Create(TextTemplate);
var products = Products.ToLiquid();
var context = new Liquid.NET.TemplateContext();
context.DefineLocalVariable("image", LiquidString.Create("kitten.jpg"));
var parsingResult = LiquidTemplate.Create(_source4);
return Task.FromResult(parsingResult.LiquidTemplate.Render(context).Result);
context.DefineLocalVariable("products", products);
return template.LiquidTemplate.Render(context).Result;
}
}
}
Loading

0 comments on commit d8aff5e

Please sign in to comment.