码迷,mamicode.com
首页 > 移动开发 > 详细

XLinq、EF、Dapper性能对比

时间:2015-06-30 00:02:13      阅读:868      评论:0      收藏:0      [点我收藏+]

标签:

继上一篇分享刚出炉的ORM框架XLinq文章之后,现在来测试一下XLinq的性能,将与EF、Dapper对比,预感会被Dapper打脸···

主要测试项有,大小表的插入、查询,大表是超过50个字段的表,小表只有2个字段。如果我的测试方法有问题,请告知,Dapper不参加插入测试

测试方法

  1. static void ExecuteTimer(string name, Action action)
  2. ????????{
  3. ????????????var watch = Stopwatch.StartNew();
  4. ????????????action();
  5. ????????????watch.Stop();
  6. ????????????Console.WriteLine(string.Format("{0}:{1}毫秒", name, watch.ElapsedMilliseconds));
  7. ????????}

原理很简单,就不多说

插入测试

  1. 小表小数据量
    1. EFDbContext db = new EFDbContext();
    2. XLinqDataContext xlinq = new XLinqDataContext();
    3. xlinq.Set<User>().Delete();
    4. db.Users.ToList();
    5. ExecuteTimer("EF小表插入10条数据", () =>
    6. {
    7. ????var userDb = db.Users;
    8. ????for (int i = 0; i < 10; i++)
    9. ????{
    10. ????????userDb.Add(new User()
    11. ????????{
    12. ????????????Username = "xxxx"
    13. ????????});
    14. ????}
    15. ????db.SaveChanges();
    16. });
    17. xlinq.Set<User>().Delete();
    18. ExecuteTimer("XLinq小表插入10条数据", () =>
    19. {
    20. ????var userDB = xlinq.Set<User>();
    21. ????for (int i = 0; i < 10; i++)
    22. ????{
    23. ????????userDB.Add(new User()
    24. ????????{
    25. ????????????Username = "xxxx"
    26. ????????});
    27. ????}
    28. ????xlinq.SaveChanges();
    29. });

    测试结果:

    技术分享

    ?

  2. 小表大数据量
    1. EFDbContext db = new EFDbContext();
    2. XLinqDataContext xlinq = new XLinqDataContext();
    3. xlinq.Set<User>().Delete();
    4. db.Users.ToList();
    5. ExecuteTimer("EF小表插入1000条数据", () =>
    6. {
    7. ????var userDb = db.Users;
    8. ????for (int i = 0; i < 1000; i++)
    9. ????{
    10. ????????userDb.Add(new User()
    11. ????????{
    12. ????????????Username = "xxxx"
    13. ????????});
    14. ????}
    15. ????db.SaveChanges();
    16. });
    17. xlinq.Set<User>().Delete();
    18. ExecuteTimer("XLinq小表插入1000条数据", () =>
    19. {
    20. ????var userDB = xlinq.Set<User>();
    21. ????for (int i = 0; i < 1000; i++)
    22. ????{
    23. ????????userDB.Add(new User()
    24. ????????{
    25. ????????????Username = "xxxx"
    26. ????????});
    27. ????}
    28. ????xlinq.SaveChanges();
    29. });
    30. xlinq.Set<User>().Delete();
    31. ExecuteTimer("XLinq小表插入1000000条数据", () =>
    32. {
    33. ????var userDB = xlinq.Set<User>();
    34. ????for (int i = 0; i < 1000000; i++)
    35. ????{
    36. ????????userDB.Add(new User()
    37. ????????{
    38. ????????????Username = "xxxx"
    39. ????????});
    40. ????}
    41. ????xlinq.SaveChanges();
    42. });

    EF不敢搞太多,懒得等那么久,插入一百万条只测试XLinq的

    测试结果:

    技术分享

  3. 大表小数据量
    1. EFDbContext db = new EFDbContext();
    2. ????????????XLinqDataContext xlinq = new XLinqDataContext();
    3. ????????????xlinq.Set<LargeUser>().Delete();
    4. ????????????ExecuteTimer("EF大表插入10条数据", () =>
    5. ????????????{
    6. ????????????????var userDb = db.LargUsers;
    7. ????????????????for (int i = 0; i < 10; i++)
    8. ????????????????{
    9. ????????????????????userDb.Add(new LargeUser()
    10. ????????????????????{
    11. ????????????????????????BankAccount = "zzzz",
    12. ????????????????????????BankBranchName = "xxxx",
    13. ????????????????????????BankCity = 1,
    14. ????????????????????????BankOtherType = "aaaaaaaa",
    15. ????????????????????????BankType = 11,
    16. ????????????????????????BorrowCredit = 11,
    17. ????????????????????????CanCreateListDate = DateTime.Now.Date,
    18. ????????????????????????CreationDate = DateTime.Now,
    19. ????????????????????????DefaultRisk = 1,
    20. ????????????????????????Dispark = 1,
    21. ????????????????????????DisplayName = "xxxx",
    22. ????????????????????????Email = "aaa",
    23. ????????????????????????ExecuteAdminID = 1,
    24. ????????????????????????flag_UsertoCEmail = 1,
    25. ????????????????????????inserttime = DateTime.Now,
    26. ????????????????????????ISactive = true,
    27. ????????????????????????IsDelete = 0,
    28. ????????????????????????IsInpour = true,
    29. ????????????????????????IsTemp = true,
    30. ????????????????????????LastLoginDate = DateTime.Now,
    31. ????????????????????????LastUpdated = DateTime.Now,
    32. ????????????????????????LendCredit = 1,
    33. ????????????????????????LendRisk = true,
    34. ????????????????????????Level = 1,
    35. ????????????????????????materialScore = 1,
    36. ????????????????????????Password = "xxx",
    37. ????????????????????????Password0 = "xxxx",
    38. ????????????????????????Password09 = "xxxx",
    39. ????????????????????????Password11 = "xxxx",
    40. ????????????????????????Password111 = "xxxx",
    41. ????????????????????????Password12 = "xxxx",
    42. ????????????????????????Password122 = "xxxx",
    43. ????????????????????????Password13 = "xxxx",
    44. ????????????????????????Password133 = "xxxx",
    45. ????????????????????????Password14 = "xxxx",
    46. ????????????????????????Password144 = "xxxx",
    47. ????????????????????????Password15 = "xxxx",
    48. ????????????????????????Password155 = "xxxx",
    49. ????????????????????????Password16 = "xxxx",
    50. ????????????????????????Password166 = "xxxx",
    51. ????????????????????????Password17 = "xxxx",
    52. ????????????????????????Password177 = "xxxx",
    53. ????????????????????????Password18 = "xxxx",
    54. ????????????????????????Password188 = "xxxx",
    55. ????????????????????????Password19 = "xxxx",
    56. ????????????????????????Password199 = "xxxx",
    57. ????????????????????????Password2 = "xxxx",
    58. ????????????????????????Password21 = "xxxx",
    59. ????????????????????????Password3 = "xxxx",
    60. ????????????????????????Password32 = "xxxx",
    61. ????????????????????????Password4 = "xxxx",
    62. ????????????????????????Password43 = "xxxx",
    63. ????????????????????????Password5 = "xxxx",
    64. ????????????????????????Password54 = "xxxx",
    65. ????????????????????????Password6 = "xxxx",
    66. ????????????????????????Password65 = "xxxx",
    67. ????????????????????????Password7 = "xxxx",
    68. ????????????????????????Password76 = "xxxx",
    69. ????????????????????????Password8 = "xxxx",
    70. ????????????????????????Password87 = "xxxx",
    71. ????????????????????????Password9 = "xxxx",
    72. ????????????????????????Password98 = "xxxx",
    73. ????????????????????????Picture = "xxxx",
    74. ????????????????????????Role = 1,
    75. ????????????????????????SpaceID = 1,
    76. ????????????????????????updatetime = DateTime.Now,
    77. ????????????????????????UserName = "xxx",
    78. ????????????????????????Verifystatus = 1
    79. ????????????????????});
    80. ????????????????}
    81. ????????????????xlinq.SaveChanges();
    82. ????????????});
    83. ????????????xlinq.Set<LargeUser>().Delete();
    84. ????????????ExecuteTimer("XLinq大表插入10条数据", () =>
    85. ????????????{
    86. ????????????????var userDb = xlinq.Set<LargeUser>();
    87. ????????????????for (int i = 0; i < 10; i++)
    88. ????????????????{
    89. ????????????????????userDb.Add(new LargeUser()
    90. ????????????????????{
    91. ????????????????????????BankAccount = "zzzz",
    92. ????????????????????????BankBranchName = "xxxx",
    93. ????????????????????????BankCity = 1,//代码太多,省略
    94. ????????????????????});
    95. ????????????????}
    96. ????????????????xlinq.SaveChanges();
    97. ????????????});

      大概50个字段吧

      技术分享

  4. 大表大数据量
    1. EFDbContext db = new EFDbContext();
    2. ????????????XLinqDataContext xlinq = new XLinqDataContext();
    3. ????????????xlinq.Set<LargeUser>().Delete();
    4. ????????????ExecuteTimer("EF大表插入1000条数据", () =>
    5. ????????????{
    6. ????????????????var userDb = db.LargUsers;
    7. ????????????????for (int i = 0; i < 1000; i++)
    8. ????????????????{
    9. ????????????????????userDb.Add(new LargeUser()
    10. ????????????????????{
    11. ????????????????????????BankAccount = "zzzz",
    12. ????????????????????????BankBranchName = "xxxx",
    13. ????????????????????????BankCity = 1,//代码太多,下面的省略
    14. ?
    15. ????????????????????});
    16. ????????????????}
    17. ????????????????db.SaveChanges();
    18. ????????????});
    19. ????????????xlinq.Set<LargeUser>().Delete();
    20. ????????????ExecuteTimer("XLinq大表插入1000条数据", () =>
    21. ????????????{
    22. ????????????????var userDb = xlinq.Set<LargeUser>();
    23. ????????????????for (int i = 0; i < 1000; i++)
    24. ????????????????{
    25. ????????????????????userDb.Add(new LargeUser()
    26. ????????????????????{
    27. ????????????????????????BankAccount = "zzzz",
    28. ????????????????????????BankBranchName = "xxxx",
    29. ????????????????????????BankCity = 1 ,//代码太多,下面的省略
    30. ????????????????????});
    31. ????????????????}
    32. ????????????????xlinq.SaveChanges();
    33. ????????????});
    34. ????????????xlinq.Set<LargeUser>().Delete();
    35. ????????????ExecuteTimer("XLinq大表插入100000条数据", () =>
    36. ????????????{
    37. ????????????????var userDb = xlinq.Set<LargeUser>();
    38. ????????????????for (int i = 0; i < 100000; i++)
    39. ????????????????{
    40. ????????????????????userDb.Add(new LargeUser()
    41. ????????????????????{
    42. ????????????????????????BankAccount = "zzzz",
    43. ????????????????????????BankBranchName = "xxxx",
    44. ????????????????????????BankCity = 1,//代码太多,下面的省略
    45. ????????????????????});
    46. ????????????????}
    47. ????????????????xlinq.SaveChanges();
    48. ????????????});

    还是一样,只XLinq才测试10万条记录的插入

    技术分享

查询测试

  1. 小表100万数据量
    1. EFDbContext db = new EFDbContext();
    2. ???????????XLinqDataContext xlinq = new XLinqDataContext();
    3. ???????????db.Users.Where(x => false).ToList();
    4. ???????????//db = new EFDbContext();
    5. ???????????ExecuteTimer("EF小表100万数据查询", () =>
    6. ???????????{
    7. ???????????????db.Users.ToList();
    8. ???????????});
    9. ???????????ExecuteTimer("XLinq小表100万数据查询", () =>
    10. ???????????{
    11. ???????????????xlinq.Set<User>().ToList();
    12. ???????????});
    13. ???????????ExecuteTimer("Dapper小表100万数据查询", () =>
    14. ???????????{
    15. ???????????????SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["test"].ConnectionString);
    16. ???????????????conn.Query<User>("SELECT * from dbo.users");
    17. ???????????});

    技术分享

    像预料一般被Dapper打脸,可能下一个测试打得更狠

  2. 大表20万数据量
    1. EFDbContext db = new EFDbContext();
    2. ????????????XLinqDataContext xlinq = new XLinqDataContext();
    3. ????????????db.Users.Where(x => false).ToList();
    4. ????????????//db = new EFDbContext();
    5. ????????????ExecuteTimer("EF大表20万数据查询", () =>
    6. ????????????{
    7. ????????????????db.LargUsers.Take(200000).ToList();
    8. ????????????});
    9. ????????????ExecuteTimer("XLinq大表20万数据查询", () =>
    10. ????????????{
    11. ????????????????xlinq.Set<LargeUser>().Take(200000).ToList();
    12. ????????????});
    13. ????????????ExecuteTimer("Dapper大表20万数据查询", () =>
    14. ????????????{
    15. ????????????????SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["test"].ConnectionString);
    16. ????????????????conn.Query<LargeUser>("SELECT top 200000 * from dbo.largeusers");
    17. ????????????});

    技术分享

    比EF快不了多少,比Dapper慢多了···

    不过还会慢慢优化

后记

终于写完了,测的时候还顺便填了些坑。

XLinq、EF、Dapper性能对比

标签:

原文地址:http://www.cnblogs.com/wzxinchen/p/4609115.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!