From 45618966f81e0553dde684b2584acdc4983169a1 Mon Sep 17 00:00:00 2001 From: Koen Bekkenutte <2912652+kbekkenutte@users.noreply.github.com> Date: Thu, 3 Jun 2021 19:45:02 +0800 Subject: [PATCH] Refactored benchmark a bit --- .../Helpers/TestEntity.cs | 3 ++ .../Helpers/TestEntityExtensions.cs | 13 +++++ .../ProjectableExtensionMethods.cs | 49 +++++++++++++++++++ .../ProjectableMethods.cs | 48 ++++++++++++++++++ .../ProjectableProperties.cs | 11 +++-- 5 files changed, 120 insertions(+), 4 deletions(-) create mode 100644 benchmarks/EntityFrameworkCore.Projectables.Benchmarks/Helpers/TestEntityExtensions.cs create mode 100644 benchmarks/EntityFrameworkCore.Projectables.Benchmarks/ProjectableExtensionMethods.cs create mode 100644 benchmarks/EntityFrameworkCore.Projectables.Benchmarks/ProjectableMethods.cs diff --git a/benchmarks/EntityFrameworkCore.Projectables.Benchmarks/Helpers/TestEntity.cs b/benchmarks/EntityFrameworkCore.Projectables.Benchmarks/Helpers/TestEntity.cs index 55cd47c..4bc741c 100644 --- a/benchmarks/EntityFrameworkCore.Projectables.Benchmarks/Helpers/TestEntity.cs +++ b/benchmarks/EntityFrameworkCore.Projectables.Benchmarks/Helpers/TestEntity.cs @@ -12,5 +12,8 @@ namespace EntityFrameworkCore.Projectables.Benchmarks.Helpers [Projectable] public int IdPlus1 => Id + 1; + + [Projectable] + public int IdPlus1Method() => Id + 1; } } diff --git a/benchmarks/EntityFrameworkCore.Projectables.Benchmarks/Helpers/TestEntityExtensions.cs b/benchmarks/EntityFrameworkCore.Projectables.Benchmarks/Helpers/TestEntityExtensions.cs new file mode 100644 index 0000000..d3ebee3 --- /dev/null +++ b/benchmarks/EntityFrameworkCore.Projectables.Benchmarks/Helpers/TestEntityExtensions.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EntityFrameworkCore.Projectables.Benchmarks.Helpers +{ + public static class TestEntityExtensions + { + public static int IdPlus1ExtensionMethod(this TestEntity entity) => entity.Id + 1; + } +} diff --git a/benchmarks/EntityFrameworkCore.Projectables.Benchmarks/ProjectableExtensionMethods.cs b/benchmarks/EntityFrameworkCore.Projectables.Benchmarks/ProjectableExtensionMethods.cs new file mode 100644 index 0000000..fdb0f9f --- /dev/null +++ b/benchmarks/EntityFrameworkCore.Projectables.Benchmarks/ProjectableExtensionMethods.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using BenchmarkDotNet.Attributes; +using EntityFrameworkCore.Projectables.Benchmarks.Helpers; +using Microsoft.EntityFrameworkCore; + +namespace EntityFrameworkCore.Projectables.Benchmarks +{ + public class ProjectableExtensionMethods + { + const int innerLoop = 10000; + + [Benchmark(Baseline = true)] + public void WithoutProjectables() + { + using var dbContext = new TestDbContext(false); + + for (int i = 0; i < innerLoop; i++) + { + dbContext.Entities.Select(x => x.Id + 1).ToQueryString(); + } + } + + [Benchmark] + public void WithProjectablesWithFullCompatibility() + { + using var dbContext = new TestDbContext(true); + + for (int i = 0; i < innerLoop; i++) + { + dbContext.Entities.Select(x => x.IdPlus1Method()).ToQueryString(); + } + } + + [Benchmark] + public void WithProjectablesWithLimitedCompatibility() + { + using var dbContext = new TestDbContext(true, false); + + for (int i = 0; i < innerLoop; i++) + { + dbContext.Entities.Select(x => x.IdPlus1Method()).ToQueryString(); + } + } + } +} diff --git a/benchmarks/EntityFrameworkCore.Projectables.Benchmarks/ProjectableMethods.cs b/benchmarks/EntityFrameworkCore.Projectables.Benchmarks/ProjectableMethods.cs new file mode 100644 index 0000000..785b52c --- /dev/null +++ b/benchmarks/EntityFrameworkCore.Projectables.Benchmarks/ProjectableMethods.cs @@ -0,0 +1,48 @@ +using System; +using System.Linq; +using BenchmarkDotNet.Attributes; +using EntityFrameworkCore.Projectables.Benchmarks.Helpers; +using EntityFrameworkCore.Projectables.Extensions; +using EntityFrameworkCore.Projectables.Infrastructure; +using Microsoft.EntityFrameworkCore; + +namespace EntityFrameworkCore.Projectables.Benchmarks +{ + public class ProjectableMethods + { + const int innerLoop = 10000; + + [Benchmark(Baseline = true)] + public void WithoutProjectables() + { + using var dbContext = new TestDbContext(false); + + for (int i = 0; i < innerLoop; i++) + { + dbContext.Entities.Select(x => x.Id + 1).ToQueryString(); + } + } + + [Benchmark] + public void WithProjectablesWithFullCompatibility() + { + using var dbContext = new TestDbContext(true); + + for (int i = 0; i < innerLoop; i++) + { + dbContext.Entities.Select(x => x.IdPlus1Method()).ToQueryString(); + } + } + + [Benchmark] + public void WithProjectablesWithLimitedCompatibility() + { + using var dbContext = new TestDbContext(true, false); + + for (int i = 0; i < innerLoop; i++) + { + dbContext.Entities.Select(x => x.IdPlus1Method()).ToQueryString(); + } + } + } +} diff --git a/benchmarks/EntityFrameworkCore.Projectables.Benchmarks/ProjectableProperties.cs b/benchmarks/EntityFrameworkCore.Projectables.Benchmarks/ProjectableProperties.cs index 00a20f0..6f2fa57 100644 --- a/benchmarks/EntityFrameworkCore.Projectables.Benchmarks/ProjectableProperties.cs +++ b/benchmarks/EntityFrameworkCore.Projectables.Benchmarks/ProjectableProperties.cs @@ -10,14 +10,17 @@ namespace EntityFrameworkCore.Projectables.Benchmarks { public class ProjectableProperties { + const int innerLoop = 10000; + [Benchmark(Baseline = true)] public void WithoutProjectables() { using var dbContext = new TestDbContext(false); - for (int i = 0; i < 10000; i++) + for (int i = 0; i < innerLoop; i++) { - dbContext.Entities.Select(x => x.Id + 1).ToQueryString(); + if (1 == i) + throw new Exception(dbContext.Entities.Select(x => x.Id + 1).ToQueryString()); } } @@ -26,7 +29,7 @@ namespace EntityFrameworkCore.Projectables.Benchmarks { using var dbContext = new TestDbContext(true); - for (int i = 0; i < 10000; i++) + for (int i = 0; i < innerLoop; i++) { dbContext.Entities.Select(x => x.IdPlus1).ToQueryString(); } @@ -37,7 +40,7 @@ namespace EntityFrameworkCore.Projectables.Benchmarks { using var dbContext = new TestDbContext(true, false); - for (int i = 0; i < 10000; i++) + for (int i = 0; i < innerLoop; i++) { dbContext.Entities.Select(x => x.IdPlus1).ToQueryString(); }