数据访问组件性能

“啊!你在用ORM?会不会性能很差啊?”
用数字来说话,打破模糊的、传言的印象。

标题提到的组件的增删改查的测试都实现了测试代码,所以除了测试外,也可以把此项目作为各个组件的入门参考demo。 

源码下载:https://github.com/alifellod/DbAccessLibTest/archive/master.zip

git地址:https://github.com/alifellod/DbAccessLibTest  欢迎园友贡献改进代码。

项目使用的是.Net Framework 4.0可以使用2010或2012打开。

默认测试数据库使用SqlServer 

测试前,请先创建数据表Test(使用名为Test的数据库,如果不用这个数据库,请更改数据库连接字符串)

 View Code

测试前清表:truncatetable Test
默认连接字符串是:Data Source=.;Initial Catalog=Test;Integrated Security=True

此程度测试代码使用了接口规范,并没有为了省事耦合在程序里,因此编写修改测试代码非常简单,所以也希望各位园友自己写上一段测试测试。
由于这些组件基本都是第一次使用,所以可能导致部分组件测试代码编写并不合理,敬请指点。
注意:各组件的测试均采用一样的测试思路,也即ORM对ORM,SQL对SQL,循环也是一样的循环。
不必拘泥于15和23的区别,而且要区别10和100的区别,也就是在一个数量级别之间比较。
线程我分别写了Task、ThreadPool和Thread的执行方式,根据自己的喜欢选择。

Task可以很好的取消创建的线程,ThreadPool测试会较为稳定,Thread很容易导致SQL连接池爆破。
测试之前,先预热一下——各个组件进行一定数量执行查询。
先看两张测试图。

 

 

数据格式:平均值-最高值-最低值
测试顺序:增、改、删
100“线程” 查询10次 增删改
 

 

ClownFish

Moon

PDF

23-96-2

21-76-6

8-25-4

16-49-2

15-37-5

4-18-2

46-116-3

23-56-3

7-33-3

 

CYQOrm

EFOrm

MoonOrm

MySoftOrm

NHibernateOrm

PDFOrm

XCodeOrm

419-560-311

23-71-8

10-64-3

46-102-24

21-47-7

12-31-4

15-60-9

889-1611-493

61-137-17

10-29-3

41-267-15

41-103-9

20-54-3

340-623-173

428-1112-255

37-113-15

5-15-2

110-195-52

37-128-7

17-50-3

364-476-246


1000“线程” 查询10次增删改

 

ClownFish

Moon

PDF

9-276-2

13-49-2

7-44-3

22-125-2

7-43-3

9-41-3

20-299-2

10-123-3

8-66-2

 

CYQOrm

EFOrm

MoonOrm

MySoftOrm

NHibernateOrm

PDFOrm

XCodeOrm

591-1376-227

29-306-9

6-52-3

50-386-11

12-259-4

10-48-3

14-231-8

680-1107-382

43-321-11

14-95-2

78-386-13

45-237-7

22-90-4

362-729-177

553-867-233

59-334-12

27-215-14

106-647-18

42-294-4

17-128-3

410-755-199


查询测试,数据行100W
100“线程” 查询返回Top 100
使用没有索引的列RowId排序

 

ClownFish

Moon

PDF

2-19-1

1-9-0

1-47-0

查询采用的根据组件提供的分页或者Top查询功能。
使用没有索引的列RowId排序

 

CYQOrm

EFOrm

MoonOrm

MySoftOrm

NHibernateOrm

PDFOrm

XCodeOrm

3975-5133-267

1452-3668-735

5230-8032-3241

1287-1670-240

3372-6264-954

2629-3825-836

1696-5363-716

使用有索引的列Guid排序

 

CYQOrm

EFOrm

MoonOrm

MySoftOrm

NHibernateOrm

PDFOrm

XCodeOrm

16-32-13

5-8-3

5967-14644-1639

2-5-1

7-127-2

1-17-0

1-9-0

经过测试,发现线程越多,越容易出现问题“超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。”导致访问很不稳定。
一个好的数据访问层应该是可以优雅的接受并处理大并发的访问,而不应该仅仅只盯住表面上的测试数据。
整个程序框架设计良好是更应该花更多心思考虑的。
从上面也可以看到,ORM性能其实并没有一般人想象的那么糟糕。

最后看看程序的代码是怎么样的。

项目目录

测试代码接口

 View Code

ClownFish-SQL测试代码

 View Code
Moon-SQL测试代码
 View Code

PDF-SQL测试代码

 View Code

CYQ-ORM测试代码

 View Code

EF-ORM测试代码

 View Code

Moon-ORM测试代码

 View Code

MySoft-ORM测试代码

 View Code

NHibernate-ORM测试代码

 View Code

PDF-ORM测试代码

 View Code

XCode-ORM测试代码

 View Code

测试耗时监控

 View Code

测试完整逻辑代码 ,300多行,慎点。

 View Code

 
到底是选择ORM而不写Sql,还是 为了追求性能,而避开ORM,就看自己的情况来取舍了。 

选择一个组件的时候,可以考虑这几方面:稳定性、性能、易用性、是否保持更新、是否有较好的文档手册、使用者社区怎么样、是否开源

上面提供的组件测试代码也可以看到这些组件的代码风格,喜欢语法糖的不妨好好看看,到底更喜欢哪种风格。

综合考虑选择。 

各组件地址
ClownFish:http://www.cnblogs.com/fish-li/ 【不开源】仅此一个是非ORM的。
CYQ:http://www.cnblogs.com/cyq1162/ 【逐版本开源】
EF: https://entityframework.codeplex.com/ 【开源】
Moon:http://www.cnblogs.com/humble/ 【不开源】
MySoft:http://www.cnblogs.com/maoyong/archive/2010/03/01/1675730.html 【逐版本开源】
NHibernate:http://nhforge.org/ 【开源】
PDF:http://home.cnblogs.com/u/bluedoctor/ 【开源】
XCode:http://xcode.codeplex.com/ 【开源】
希望更多的园友分享或开源自己所能知道的心爱的数据访问组件。

小广告:广州有工作机会的,烦请推荐。

作者: 火地晋 
出处: http://yelaiju.cnblogs.com 
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/Leo_wl/p/3216577.html