منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب
مقارنة سريعة بين سرعة Entity و ADO.NET و Dapper وايهما اسرع - نسخة قابلة للطباعة

+- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb)
+-- قسم : قسم لغة السي شارب C#.NET (http://vb4arb.com/vb/forumdisplay.php?fid=175)
+--- قسم : قسم مقالات C#.NET (http://vb4arb.com/vb/forumdisplay.php?fid=177)
+--- الموضوع : مقارنة سريعة بين سرعة Entity و ADO.NET و Dapper وايهما اسرع (/showthread.php?tid=24954)



مقارنة سريعة بين سرعة Entity و ADO.NET و Dapper وايهما اسرع - viv - 13-05-18

Dapper vs Entity Framework vs ADO.NET Performance Benchmarking





بداية هذا شكل او مخطط قاعدة البيانات المستخدم



جدول الرياضات والتي لها العديد من الفرق الرياضية وكل فريق له العديد من الاعبين

في الاختبار هذا سوف نستعلم عن عدد الرياضات وعدد الفرق وعدد اللاعبين

الكود المستخدم للـ 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.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.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.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<PlayerDTOTeamDTOPlayerDTO>("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", (playerteam) => { 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


RE: مقارنة سريعة بين سرعة Entity و ADO.NET و Dapper وايهما اسرع - محمد كريّم - 14-05-18

حسب ما جاء في التعليقات على المقالة الأصلية فإن المقارنة غير عادلة
أيضا التجربة كانت على نسخة قديمة من EF


RE: مقارنة سريعة بين سرعة Entity و ADO.NET و Dapper وايهما اسرع - viv - 14-05-18

لا اعتقد ان هناك اختلاف جوهري سينقل EF من هنا الى هناك بعصا سحرية .
حسب رأيي انا لن يكون هناك اختلاف .
كنت اريد ان اختبر النتيجة بنفسي ولكن نشرت المقال وقلت ربما هناك من هو متفرغ ويجرب
طبعا هنا دائما من هو متعصب الى جهة ما .
وخير نتيجة هي ان يختبر الشخص بنفسه كل شئ


RE: مقارنة سريعة بين سرعة Entity و ADO.NET و Dapper وايهما اسرع - viv - 15-05-18

لاحظت هنا مثلا مقالة اخرى عن Dapeer  

PHP كود :
https://github.com/StackExchange/Dapper/blob/master/Readme.md 


Performance of SELECT mapping over 500 iterations - POCO serialization

اكمل العملية في 49ms بينما FE اكملها في 631ms