I read that Dapper is faster than EF (at least at retrieving data) and I want to confirm that so I am comparing Dapper and EntityFramework with the help of BenchmarkDotNet.
So I tried this...
[Benchmark]
public Player EntityFramework_GetByName()
{
using (ApplicationDbContext context = new())
{
return context.Players.FirstOrDefault(x => x.FirstName == _name);
}
}
[Benchmark]
public Player Dapper_GetByName()
{
using (SqlConnection conn = new(Database.ConnectionString))
{
return conn.QueryFirstOrDefault<Player>($"SELECT * FROM Players WHERE FirstName = '{_name}'");
}
}
But the result are not what I expecting...
Then I read here about the column type "problem" and how that can affect the performance, so I change the type of the column to NVarchar with max length of 100 and my code for the Dapper to this
[Benchmark]
public Player Dapper_GetByName()
{
using (SqlConnection conn = new(Database.ConnectionString))
{
return conn.QueryFirstOrDefault<Player>($"SELECT * FROM Players WHERE FirstName = @name", new
{ @name = new DbString { Value = _name, IsAnsi = false } });
}
}
The results of the benchmark tests are the following..
Method | Mean | Error | StdDev | Allocated |
---|---|---|---|---|
Dapper_GetByName | 41,092.8 us | 1,400.39 us | 4,085.0 us | 4 KB |
EntityFramework_GetByName | 2,971.6 us | 305.43 us | 895.8 us | 110 KB |
The difference is very big. Is there a way to improve this?
Uhm, maybe you should not compare
vs
Benchmark only the inner part: