Dapper vs Entity Framework vs ADO.NET Performance Benchmarking
بداية هذا شكل او مخطط قاعدة البيانات المستخدم
جدول الرياضات والتي لها العديد من الفرق الرياضية وكل فريق له العديد من الاعبين
في الاختبار هذا سوف نستعلم عن عدد الرياضات وعدد الفرق وعدد اللاعبين
الكود المستخدم للـ Entinty
الكود المستخدم للـ ADO.net
الكود المستخدم للـ Dapeer
الاختبار كان لعشرة مرات يحتوي كل منها على 8 رياضات ، و 30 فريقًا في كل رياضة ، و 100 لاعب لكل فريق
النتائج
التحليل
ان Entity Framework كان بطئ مقارنة بي Ado.net وكذلك Dapeer
بينما تفوق Ado.net في حالة وتفوق عليه Daperr في حالتين وكانوا متقاربين نوعا ما .
اذا Dapeer اسرع من EF بدون شك واسرع قليلا من Ado.net من وجهة نظري الاختيار بينهم يتبقى في ما الذي ترتاح له انت اقصد بين Dapeer و Ado.net
بداية هذا شكل او مخطط قاعدة البيانات المستخدم
جدول الرياضات والتي لها العديد من الفرق الرياضية وكل فريق له العديد من الاعبين
في الاختبار هذا سوف نستعلم عن عدد الرياضات وعدد الفرق وعدد اللاعبين
الكود المستخدم للـ Entinty
PHP كود :
public class EntityFramework : ITestSignature
{
public long GetPlayerByID(int id)
{
Stopwatch watch = new Stopwatch();
watch.Start();
using (SportContext context = new SportContext())
{
var player = context.Players.Where(x => x.Id == id).First();
}
watch.Stop();
return watch.ElapsedMilliseconds;
}
public long GetPlayersForTeam(int teamId)
{
Stopwatch watch = new Stopwatch();
watch.Start();
using (SportContext context = new SportContext())
{
var players = context.Players.Where(x => x.TeamId == teamId).ToList();
}
watch.Stop();
return watch.ElapsedMilliseconds;
}
public long GetTeamsForSport(int sportId)
{
Stopwatch watch = new Stopwatch();
watch.Start();
using (SportContext context = new SportContext())
{
var players = context.Teams.Include(x=>x.Players).Where(x => x.SportId == sportId).ToList();
}
watch.Stop();
return watch.ElapsedMilliseconds;
}
}
الكود المستخدم للـ ADO.net
PHP كود :
public class ADONET : ITestSignature
{
public long GetPlayerByID(int id)
{
Stopwatch watch = new Stopwatch();
watch.Start();
using(SqlConnection conn = new SqlConnection(Constants.ConnectionString))
{
conn.Open();
using(SqlDataAdapter adapter = new SqlDataAdapter("SELECT Id, FirstName, LastName, DateOfBirth, TeamId FROM Player WHERE Id = @ID", conn))
{
adapter.SelectCommand.Parameters.Add(new SqlParameter("@ID", id));
DataTable table = new DataTable();
adapter.Fill(table);
}
}
watch.Stop();
return watch.ElapsedMilliseconds;
}
public long GetPlayersForTeam(int teamId)
{
Stopwatch watch = new Stopwatch();
watch.Start();
using(SqlConnection conn = new SqlConnection(Constants.ConnectionString))
{
conn.Open();
using(SqlDataAdapter adapter = new SqlDataAdapter("SELECT Id, FirstName, LastName, DateOfBirth, TeamId FROM Player WHERE TeamId = @ID", conn))
{
adapter.SelectCommand.Parameters.Add(new SqlParameter("@ID", teamId));
DataTable table = new DataTable();
adapter.Fill(table);
}
}
watch.Stop();
return watch.ElapsedMilliseconds;
}
public long GetTeamsForSport(int sportId)
{
Stopwatch watch = new Stopwatch();
watch.Start();
using(SqlConnection conn = new SqlConnection(Constants.ConnectionString))
{
conn.Open();
using(SqlDataAdapter adapter = new SqlDataAdapter("SELECT p.Id, p.FirstName, p.LastName, p.DateOfBirth, p.TeamId, t.Id as TeamId, t.Name, t.SportId FROM Player p INNER JOIN Team t ON p.TeamId = t.Id WHERE t.SportId = @ID", conn))
{
adapter.SelectCommand.Parameters.Add(new SqlParameter("@ID", sportId));
DataTable table = new DataTable();
adapter.Fill(table);
}
}
watch.Stop();
return watch.ElapsedMilliseconds;
}
}
الكود المستخدم للـ Dapeer
PHP كود :
public class Dapper : ITestSignature
{
public long GetPlayerByID(int id)
{
Stopwatch watch = new Stopwatch();
watch.Start();
using (SqlConnection conn = new SqlConnection(Constants.ConnectionString))
{
conn.Open();
var player = conn.Query<PlayerDTO>("SELECT Id, FirstName, LastName, DateOfBirth, TeamId FROM Player WHERE Id = @ID", new{ ID = id});
}
watch.Stop();
return watch.ElapsedMilliseconds;
}
public long GetPlayersForTeam(int teamId)
{
Stopwatch watch = new Stopwatch();
watch.Start();
using (SqlConnection conn = new SqlConnection(Constants.ConnectionString))
{
conn.Open();
var players = conn.Query<List<PlayerDTO>>("SELECT Id, FirstName, LastName, DateOfBirth, TeamId FROM Player WHERE TeamId = @ID", new { ID = teamId });
}
watch.Stop();
return watch.ElapsedMilliseconds;
}
public long GetTeamsForSport(int sportId)
{
Stopwatch watch = new Stopwatch();
watch.Start();
using (SqlConnection conn = new SqlConnection(Constants.ConnectionString))
{
conn.Open();
var players = conn.Query<PlayerDTO, TeamDTO, PlayerDTO>("SELECT p.Id, p.FirstName, p.LastName, p.DateOfBirth, p.TeamId, t.Id as TeamId, t.Name, t.SportId FROM Team t "
+ "INNER JOIN Player p ON t.Id = p.TeamId WHERE t.SportId = @ID", (player, team) => { return player; }, splitOn: "TeamId", param: new { ID = sportId });
}
watch.Stop();
return watch.ElapsedMilliseconds;
}
}
الاختبار كان لعشرة مرات يحتوي كل منها على 8 رياضات ، و 30 فريقًا في كل رياضة ، و 100 لاعب لكل فريق
النتائج
التحليل
ان Entity Framework كان بطئ مقارنة بي Ado.net وكذلك Dapeer
بينما تفوق Ado.net في حالة وتفوق عليه Daperr في حالتين وكانوا متقاربين نوعا ما .
اذا Dapeer اسرع من EF بدون شك واسرع قليلا من Ado.net من وجهة نظري الاختيار بينهم يتبقى في ما الذي ترتاح له انت اقصد بين Dapeer و Ado.net