using System; using System.Linq.Expressions; using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Configs; using BenchmarkDotNet.Diagnosers; using Moq; using Umbraco.Core.Models; using Umbraco.Core.Persistence.Mappers; using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Persistence.SqlSyntax; namespace Umbraco.Tests.Benchmarks { [Config(typeof(Config))] public class ModelToSqlExpressionHelperBenchmarks { private class Config : ManualConfig { public Config() { Add(new MemoryDiagnoser()); } } public ModelToSqlExpressionHelperBenchmarks() { var contentMapper = new ContentMapper(); _cachedExpression = new CachedExpression(); var mapperCollection = new Mock(); mapperCollection.Setup(x => x[It.IsAny()]).Returns(contentMapper); _mapperCollection = mapperCollection.Object; } private readonly ISqlSyntaxProvider _syntaxProvider = new SqlCeSyntaxProvider(); private readonly CachedExpression _cachedExpression; private readonly IMapperCollection _mapperCollection; [Benchmark(Baseline = true)] public void WithNonCached() { for (int i = 0; i < 100; i++) { var a = i; var b = i*10; Expression> predicate = content => content.Path.StartsWith("-1") && content.Published && (content.ContentTypeId == a || content.ContentTypeId == b); var modelToSqlExpressionHelper = new ModelToSqlExpressionVisitor(_syntaxProvider, _mapperCollection); var result = modelToSqlExpressionHelper.Visit(predicate); } } [Benchmark] public void WithCachedExpression() { for (int i = 0; i < 100; i++) { var a = i; var b = i * 10; Expression> predicate = content => content.Path.StartsWith("-1") && content.Published && (content.ContentTypeId == a || content.ContentTypeId == b); var modelToSqlExpressionHelper = new ModelToSqlExpressionVisitor(_syntaxProvider, _mapperCollection); //wrap it! _cachedExpression.Wrap(predicate); var result = modelToSqlExpressionHelper.Visit(_cachedExpression); } } } }