从刚刚开始接触ORM到现在已有超过八年时间,用过了不少ORM框架也了解了不少ORM框架,看过N种关于ORM框架的相关资料与评论,各种言论让人很难选择。在ORM的众多问题中最突出的问题是关于性能方面的问题,因此我在看了国外的一遍文章(Dapper vs Entity Framework vs ADO.NET Performance Benchmarking)后受到启发,在这个文章的基础上扩展了测试用例分享给大家。

用于测试是模型是基于一个订单系统,如下图所示,主要有客户、产品、仓库、订单及订单明细。其中数据表之前的关系从图中可以看出,此外产品、订单明细是自增列,仓库是两个主键构成的复合主键表。虽然只有5张表,但是已经包含了数据表的常用情况。

Mego(01) - NET中主流ORM框架性能对比

数据初始化

我们使用以上代码创建数据库,初始化数据表结构,生成测试数据,生成数据量如下表所示。

 1 static void InitialDatabase()
 2 {
 3     using (var ef = new Models.EFContext())
 4     {
 5         if (!ef.Database.Exists())
 6         {
 7             ef.Database.Create();
 8 
 9             using (var db = new Models.MegoContext())
10             {
11                 db.InitialTable();
12             }
13         }
14     }
15     using (var db = new Models.MegoContext())
16     {
17         db.InitialData();
18     }
19 }

 

表名 说明 行数
Customers 客户表 10000
Products 产品表 9000
Warehouses 仓库表 30176
Orders 订单表 100000
OrderDetails 订单明细 600271

这些数据量已经快接近一个小型系统的数据量了,如果需要到本地执行,请将App.config文件中的连接字符串改成自己的数据库名直接运行即可。

 

测试用例说明

目前参与测试的框架如下:

本测试中的例子不仅仅限定于目前指定的这几种框架,这里定义了一个接口,如果想加入更多测试框架可以参考代码自行加入。

 1     /// <summary>
 2     /// 性能测试项目
 3     /// </summary>
 4     public interface IPerformanceTest
 5     {
 6         /// <summary>
 7         /// 框架名称。
 8         /// </summary>
 9         string Framework { get; }
10         /// <summary>
11         /// 随机获取一个客户
12         /// </summary>
13         /// <param name="id"></param>
14         /// <returns></returns>
15         long GetCustomerById(int id);
16         /// <summary>
17         /// 随机获取一个订单的所有明细
18         /// </summary>
19         /// <param name="orderId"></param>
20         /// <returns></returns>
21         long GetDetailsByOrder(int orderId);
22         /// <summary>
23         /// 随机获取一个订单及所有明细
24         /// </summary>
25         /// <param name="orderId"></param>
26         /// <returns></returns>
27         long GetOrderAndDetails(int orderId);
28         /// <summary>
29         /// 插入离散的N个客户。
30         /// </summary>
31         /// <returns></returns>
32         long InsertDiscreteCustomers(Customer[] customers);
33         /// <summary>
34         /// 插入离散的N个产品,自增主键。
35         /// </summary>
36         /// <returns></returns>
37         long InsertDiscreteProducts(Product[] products);
38         /// <summary>
39         /// 更新离散的N个客户。
40         /// </summary>
41         /// <returns></returns>
42         long UpdateDiscreteCustomers(Customer[] customers);
43         /// <summary>
44         /// 删除离散的N个明细。
45         /// </summary>
46         /// <returns></returns>
47         long DeleteDiscreteDetails(OrderDetail[] details);
48         /// <summary>
49         /// 删除离散的N个仓库,多主键。
50         /// </summary>
51         /// <returns></returns>
52         long DeleteDiscreteWarehouses(Warehouse[] warehouses);
53     }
View Code

相关文章:

  • 2021-11-14
  • 2018-05-20
  • 2021-11-12
  • 2022-01-01
  • 2021-09-20
  • 2021-10-26
猜你喜欢
  • 2018-04-07
  • 2017-12-01
  • 2018-04-07
  • 2020-12-20
  • 2022-01-02
  • 2021-09-03
  • 2021-09-13
  • 2021-12-15
相关资源
相似解决方案