Commit 0b867bbf authored by Nick Craver's avatar Nick Craver

Add EF compiled query to benchmarks

parent 0b168789
using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Attributes;
using Dapper.Tests.Performance.Linq2Sql; using Dapper.Tests.Performance.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using System; using System;
using System.Data.Linq;
using System.Linq; using System.Linq;
namespace Dapper.Tests.Performance namespace Dapper.Tests.Performance
{ {
public class EFCoreBenchmarks : BenchmarkBase public class EFCoreBenchmarks : BenchmarkBase
{ {
private EntityFrameworkCore.EFCoreContext Context; private EFCoreContext Context;
private static readonly Func<DataClassesDataContext, int, Linq2Sql.Post> compiledQuery = private static readonly Func<EFCoreContext, int, Post> compiledQuery =
CompiledQuery.Compile((DataClassesDataContext ctx, int id) => ctx.Posts.First(p => p.Id == id)); EF.CompileQuery((EFCoreContext ctx, int id) => ctx.Posts.First(p => p.Id == id));
[GlobalSetup] [GlobalSetup]
public void Setup() public void Setup()
{ {
BaseSetup(); BaseSetup();
Context = new EntityFrameworkCore.EFCoreContext(_connection.ConnectionString); Context = new EFCoreContext(_connection.ConnectionString);
} }
[Benchmark(Description = "Normal")] [Benchmark(Description = "Normal")]
...@@ -27,6 +26,13 @@ public Post Normal() ...@@ -27,6 +26,13 @@ public Post Normal()
return Context.Posts.First(p => p.Id == i); return Context.Posts.First(p => p.Id == i);
} }
[Benchmark(Description = "Compiled")]
public Post Compiled()
{
Step();
return compiledQuery(Context, i);
}
[Benchmark(Description = "SqlQuery")] [Benchmark(Description = "SqlQuery")]
public Post SqlQuery() public Post SqlQuery()
{ {
......
...@@ -125,42 +125,43 @@ Intel Core i7-7700HQ CPU 2.80GHz (Kaby Lake), 1 CPU, 8 logical and 4 physical co ...@@ -125,42 +125,43 @@ Intel Core i7-7700HQ CPU 2.80GHz (Kaby Lake), 1 CPU, 8 logical and 4 physical co
Frequency=2742188 Hz, Resolution=364.6723 ns, Timer=TSC Frequency=2742188 Hz, Resolution=364.6723 ns, Timer=TSC
[Host] : .NET Framework 4.7.2 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.3163.0 [Host] : .NET Framework 4.7.2 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.3163.0
Dry : .NET Framework 4.7.2 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.3163.0 Dry : .NET Framework 4.7.2 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.7.3163.0
``` ```
| ORM | Method | Return | Mean | StdDev | Error | Gen 0 | Gen 1 | Allocated | | ORM | Method | Return | Mean | StdDev | Error | Gen 0 | Gen 1 | Allocated |
|------------- |------------------------------ |-------- |------------:|-----------:|-----------:|--------:|-------:|----------:| |------------- |------------------------------ |-------- |------------:|-----------:|-----------:|--------:|-------:|----------:|
| Belgrade | ExecuteReader | Post | 93.20 us | 17.628 us | 26.652 us | 3.6000 | 1.0000 | 11.28 KB | | HandCoded | SqlCommand | Post | 86.76 us | 1.573 us | 2.379 us | 3.8000 | - | 12.24 KB |
| PetaPoco | &#39;Fetch&lt;Post&gt; (Fast)&#39; | Post | 95.47 us | 2.608 us | 3.943 us | 4.4000 | - | 13.65 KB | | PetaPoco | &#39;Fetch&lt;Post&gt; (Fast)&#39; | Post | 95.43 us | 2.434 us | 3.681 us | 4.4000 | - | 13.65 KB |
| Dapper | QueryFirstOrDefault&lt;dynamic&gt; | dynamic | 99.27 us | 6.661 us | 10.070 us | 4.2000 | - | 13.51 KB | | HandCoded | DataTable | dynamic | 98.18 us | 5.242 us | 7.925 us | 2.2000 | 0.6000 | 12.45 KB |
| Dapper | &#39;Query&lt;T&gt; (buffered)&#39; | Post | 99.37 us | 6.892 us | 10.420 us | 4.4000 | - | 13.79 KB | | PetaPoco | Fetch&lt;Post&gt; | Post | 98.18 us | 2.252 us | 3.404 us | 4.6000 | - | 14.59 KB |
| Massive | &#39;Query (dynamic)&#39; | dynamic | 100.11 us | 2.543 us | 3.845 us | 4.6000 | - | 14.21 KB | | Massive | &#39;Query (dynamic)&#39; | dynamic | 98.47 us | 3.102 us | 4.690 us | 4.6000 | - | 14.21 KB |
| Dapper | &#39;Query&lt;dynamic&gt; (buffered)&#39; | dynamic | 100.30 us | 4.362 us | 6.595 us | 4.4000 | - | 13.88 KB | | Belgrade | ExecuteReader | Post | 99.14 us | 15.731 us | 23.783 us | 3.6000 | 1.0000 | 11.37 KB |
| HandCoded | SqlCommand | Post | 102.95 us | 1.909 us | 2.886 us | 3.8000 | - | 12.24 KB | | Dapper | &#39;Query&lt;dynamic&gt; (buffered)&#39; | dynamic | 100.42 us | 5.311 us | 8.030 us | 4.4000 | - | 13.88 KB |
| HandCoded | DataTable | dynamic | 105.04 us | 4.730 us | 7.151 us | 2.2000 | 0.6000 | 12.45 KB | | Dapper | &#39;Contrib Get&lt;T&gt;&#39; | Post | 102.55 us | 9.289 us | 14.044 us | 4.6000 | - | 14.45 KB |
| Susanoo | &#39;Mapping Static (dynamic)&#39; | dynamic | 105.10 us | 8.457 us | 12.786 us | 4.8000 | - | 14.97 KB | | Dapper | &#39;Query&lt;T&gt; (buffered)&#39; | Post | 104.85 us | 10.278 us | 15.539 us | 4.4000 | - | 13.79 KB |
| Dapper | &#39;Contrib Get&lt;T&gt;&#39; | Post | 107.35 us | 9.207 us | 13.920 us | 4.6000 | - | 14.45 KB | | ServiceStack | SingleById | Post | 107.83 us | 5.144 us | 7.778 us | 5.6000 | - | 17.53 KB |
| Susanoo | &#39;Mapping Static&#39; | Post | 111.39 us | 7.716 us | 11.666 us | 4.8000 | - | 14.99 KB | | Dapper | QueryFirstOrDefault&lt;dynamic&gt; | dynamic | 109.78 us | 7.689 us | 11.624 us | 4.2000 | - | 13.51 KB |
| Dapper | QueryFirstOrDefault&lt;T&gt; | Post | 112.32 us | 5.053 us | 7.639 us | 4.2000 | - | 13.47 KB | | Dapper | QueryFirstOrDefault&lt;T&gt; | Post | 112.97 us | 4.081 us | 6.170 us | 4.2000 | - | 13.47 KB |
| PetaPoco | Fetch&lt;Post&gt; | Post | 114.62 us | 3.273 us | 4.948 us | 4.6000 | - | 14.59 KB | | Susanoo | &#39;Mapping Static&#39; | Post | 118.91 us | 8.786 us | 13.282 us | 4.8000 | - | 14.99 KB |
| Susanoo | &#39;Mapping Cache (dynamic)&#39; | dynamic | 124.43 us | 3.182 us | 4.811 us | 6.6000 | - | 20.41 KB | | Susanoo | &#39;Mapping Static (dynamic)&#39; | dynamic | 119.57 us | 6.985 us | 10.560 us | 4.8000 | - | 14.97 KB |
| Dapper | &#39;Query&lt;dynamic&gt; (unbuffered)&#39; | dynamic | 124.43 us | 4.195 us | 6.342 us | 4.4000 | - | 13.87 KB | | Susanoo | &#39;Mapping Cache&#39; | Post | 123.68 us | 6.693 us | 10.118 us | 6.8000 | - | 20.9 KB |
| Linq2Sql | Compiled | Post | 125.92 us | 6.187 us | 9.354 us | 3.0000 | - | 9.82 KB | | Dapper | &#39;Query&lt;dynamic&gt; (unbuffered)&#39; | dynamic | 127.06 us | 8.748 us | 13.225 us | 4.4000 | - | 13.87 KB |
| Susanoo | &#39;Mapping Cache&#39; | Post | 128.99 us | 10.511 us | 15.891 us | 6.8000 | - | 20.9 KB | | Dapper | &#39;Query&lt;T&gt; (unbuffered)&#39; | Post | 132.28 us | 9.350 us | 14.136 us | 4.4000 | - | 13.84 KB |
| ServiceStack | SingleById | Post | 130.70 us | 5.525 us | 8.354 us | 5.6000 | - | 17.53 KB | | Susanoo | &#39;Mapping Cache (dynamic)&#39; | dynamic | 133.45 us | 4.179 us | 6.318 us | 6.6000 | - | 20.41 KB |
| Dapper | &#39;Query&lt;T&gt; (unbuffered)&#39; | Post | 146.41 us | 12.281 us | 18.568 us | 4.4000 | - | 13.84 KB | | Linq2Sql | Compiled | Post | 133.46 us | 6.137 us | 9.278 us | 3.0000 | - | 9.82 KB |
| EF6 | SqlQuery | Post | 197.36 us | 139.733 us | 211.257 us | 9.0000 | - | 27.86 KB | | EFCore | Compiled | Post | 180.70 us | 65.498 us | 99.024 us | 5.2000 | - | 16.08 KB |
| NHibernate | Get&lt;T&gt; | Post | 201.49 us | 7.650 us | 11.565 us | 10.4000 | - | 32.5 KB | | EF6 | SqlQuery | Post | 187.09 us | 136.314 us | 206.088 us | 9.0000 | - | 27.86 KB |
| NHibernate | HQL | Post | 231.44 us | 31.127 us | 47.060 us | 11.2000 | - | 35 KB | | NHibernate | Get&lt;T&gt; | Post | 202.34 us | 10.271 us | 15.528 us | 10.4000 | - | 32.5 KB |
| EFCore | Normal | Post | 244.87 us | 69.894 us | 105.670 us | 6.4000 | - | 20.25 KB | | NHibernate | HQL | Post | 216.95 us | 26.889 us | 40.653 us | 11.2000 | - | 35 KB |
| EFCore | &#39;No Tracking&#39; | Post | 253.52 us | 61.048 us | 92.296 us | 6.8000 | - | 21.36 KB | | EFCore | &#39;No Tracking&#39; | Post | 243.18 us | 59.359 us | 89.742 us | 6.8000 | - | 21.36 KB |
| Linq2Sql | ExecuteQuery | Post | 264.58 us | 4.516 us | 6.828 us | 13.6000 | - | 42.34 KB | | EFCore | Normal | Post | 245.60 us | 72.618 us | 109.788 us | 6.4000 | - | 20.25 KB |
| EFCore | SqlQuery | Post | 273.44 us | 71.265 us | 107.742 us | 6.6000 | - | 20.75 KB | | Linq2Sql | ExecuteQuery | Post | 246.66 us | 6.215 us | 9.396 us | 13.6000 | - | 42.34 KB |
| NHibernate | Criteria | Post | 274.41 us | 11.087 us | 16.762 us | 21.2000 | - | 65.37 KB | | NHibernate | Criteria | Post | 252.51 us | 18.303 us | 27.672 us | 21.2000 | - | 65.37 KB |
| EF6 | Normal | Post | 317.09 us | 155.828 us | 235.589 us | 15.6000 | - | 48.29 KB | | EFCore | SqlQuery | Post | 263.34 us | 73.919 us | 111.755 us | 6.6000 | - | 20.75 KB |
| EF6 | &#39;No Tracking&#39; | Post | 343.42 us | 150.279 us | 227.201 us | 17.8000 | - | 55.1 KB | | EF6 | Normal | Post | 308.46 us | 154.203 us | 233.133 us | 15.6000 | - | 48.29 KB |
| NHibernate | SQL | Post | 355.03 us | 17.416 us | 26.330 us | 32.8000 | - | 101.06 KB | | NHibernate | SQL | Post | 322.13 us | 9.530 us | 14.408 us | 32.8000 | - | 101.06 KB |
| Linq2Sql | Normal | Post | 388.27 us | 260.226 us | 393.424 us | 4.6000 | 1.4000 | 14.68 KB | | EF6 | &#39;No Tracking&#39; | Post | 324.12 us | 134.870 us | 203.905 us | 17.8000 | - | 55.1 KB |
| NHibernate | LINQ | Post | 1,156.97 us | 35.166 us | 53.167 us | 20.2000 | - | 62.13 KB | | Linq2Sql | Normal | Post | 370.55 us | 238.033 us | 359.871 us | 4.6000 | 1.4000 | 14.68 KB |
| NHibernate | LINQ | Post | 1,110.87 us | 36.863 us | 55.731 us | 20.2000 | - | 62.13 KB |
Feel free to submit patches that include other ORMs - when running benchmarks, be sure to compile in Release and not attach a debugger (<kbd>Ctrl</kbd>+<kbd>F5</kbd>). Feel free to submit patches that include other ORMs - when running benchmarks, be sure to compile in Release and not attach a debugger (<kbd>Ctrl</kbd>+<kbd>F5</kbd>).
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment