测试 ClownFish、CYQ、Entity Framework、Moon、MySoft、NHibernate、PDF、XCode数据访问组件性能...
由于很多园友反馈,有的组件不应该缺席、测试复杂度不够、测试还缺乏一定的公平。
因此考虑在下一个版本中,确保在更加公平的前提下进行更高复杂度的测试 。
同时将分为2组测试,纯SQL组件及纯ORM组件, 如果纯SQL组件不足,就只进行纯ORM组件的测试。
待加入测试组件有Dapper、PetaPoco/NPoco、Elinq、FluentData ,有更好的建议,请留言。
--------------------------------------------------------------
“啊!你在用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的数据库,如果不用这个数据库,请更改数据库连接字符串)
(
[RowId] [int] IDENTITY(1,1) NOT NULL,
[Guid] [varchar](50) primary key NOT NULL,
[Content] [nvarchar](500) NULL,
[CreateDate] [datetime] NULL default getdate(),
[EditDate] [datetime] NULL
)
测试前清表:truncatetable Test
默认连接字符串是:Data Source=.;Initial Catalog=Test;Integrated Security=True
此程度测试代码使用了接口规范,并没有为了省事耦合在程序里,因此编写修改测试代码非常简单,所以也希望各位园友自己写上一段测试测试。
由于这些组件基本都是第一次使用,所以可能导致部分组件测试代码编写并不合理,敬请指点。
注意:各组件的测试均采用一样的测试思路,也即ORM对ORM,SQL对SQL,循环也是一样的循环。
不必拘泥于15和23的区别,而是要区别10和100的区别,也就是在一个数量级别之间比较。
线程我分别写了Task、ThreadPool和Thread的执行方式,根据自己的喜欢选择。
测试之前,可先预热一下——各个组件进行一定数量查询。
先看两张测试图。
分别是ClownFish和EF的测试图,X轴是线程名称,Y轴是耗时。
特别说明: CYQ的数据是使用更新前的组件,在昨晚测试整理的。今天收到秋天园友的反馈,已经在git提交了更新,测试的数据也回归正常。
因此,数据也调整过来。(2013-07-27 13:53)
关于XCode的测试数据,请参看大石头的说明。大石头建议在大数据的访问时使用此组件,并开启缓存。
同时不再接受新的组件更新,除非是在新的测试版本中,以避免针对性的更新。
数据格式:平均值-最高值-最低值
测试顺序:增、改、删
100“线程” 查询10次 增删改
|
ClownFish |
Moon |
|
增 |
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 |
增 |
24-79-5 |
23-71-8 |
10-64-3 |
46-102-24 |
21-47-7 |
12-31-4 |
15-60-9 |
删 |
11-61-4 |
61-137-17 |
10-29-3 |
41-267-15 |
41-103-9 |
20-54-3 |
340-623-173 |
改 |
29-182-18 |
37-113-15 |
5-15-2 |
110-195-52 |
37-128-7 |
17-50-3 |
364-476-246 |
1000“线程” 查询10次增删改
|
ClownFish |
Moon |
|
增 |
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 |
增 |
79-961-3 |
29-306-9 |
6-52-3 |
50-386-11 |
12-259-4 |
10-48-3 |
14-231-8 |
删 |
29-471-4 |
43-321-11 |
14-95-2 |
78-386-13 |
45-237-7 |
22-90-4 |
362-729-177 |
改 |
30-438-3 |
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 |
|
查 |
2-19-1 |
1-9-0 |
1-47-0 |
查询采用的根据组件提供的分页或者Top查询功能。(moon及xcode使用的是分页查询)
使用没有索引的列RowId排序
|
CYQOrm |
EFOrm |
MoonOrm |
MySoftOrm |
NHibernateOrm |
PDFOrm |
XCodeOrm |
查 |
1339-2220-281 |
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性能其实并没有一般人想象的那么糟糕。
最后看看程序的代码是怎么样的。
项目目录
测试代码接口
ClownFish-SQL测试代码
PDF-SQL测试代码
CYQ-ORM测试代码
EF-ORM测试代码
Moon-ORM测试代码
MySoft-ORM测试代码
NHibernate-ORM测试代码
PDF-ORM测试代码
XCode-ORM测试代码
测试耗时监控
测试完整逻辑代码 ,300多行,慎点。
到底是选择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://www.cnblogs.com/bluedoctor/【开源】
XCode:http://xcode.codeplex.com/ 【开源】
希望更多的园友分享或开源自己所能知道的心爱的数据访问组件。
QQ交流群:9524888 ,如果想提交测试代码,可以直接发给我,我加上去。
更新修正说明:
由于ClownFish提出测试的时候,使用了匿名对象,因此修改为SQL的直接执行,测试数据如下。
由于1000线程的测试,在500左右,就出现连接超时问题,不能提供测试数据,有兴趣的朋友,自己运行测试。对此造成误解,请谅解。
37-375-5
215-611-29
223-562-40
12-181-3
7-21-4
10-138-3
8-71-4
11-187-4
25-227-3
107-829-3
265-679-15
226-609-19
100-10-delete
10-90-2
24-115-3
33-282-2
37-174-3
111-537-2
23-203-2
8-54-3
100-10-update
11-174-3
16-190-4
21-69-2
21-58-4
75-1155-3
本文转自火地晋博客园博客,原文链接:http://www.cnblogs.com/yelaiju/p/3209506.html,如需转载请自行联系原作者
测试 ClownFish、CYQ、Entity Framework、Moon、MySoft、NHibernate、PDF、XCode数据访问组件性能...相关推荐
- 测试 ClownFish、CYQ、Entity Framework、Moon、MySoft、NHibernate、PDF、XCode数据访问组件性能
"啊!你在用ORM?会不会性能很差啊?" 用数字来说话,打破模糊的.传言的印象. 标题提到的组件"增删改查"都实现了测试代码,所以除了测试外,也可以把此项目作为 ...
- Entity Framework技术系列之1:数据访问技术概述
前言 .NET Framework自2002年发布以来,已经历了十来个年头.相应的,.NET平台上的数据访问技术也在不断发展,从最基础的ADO.NET,到SqlHelper简单帮助类,到DAAB(Da ...
- .net core引用错误的Entity Framework而导致不能正常迁移数据的解决办法
本人刚学.net core,因此在学习过程中会遇上许许多多的坑.每一位初学者最大的问题在于资料的查看不仔细或是没有正确理解里面的内容,导致在后面自己在不知道错误的情况下做了一个小动作.对于完全没有理解 ...
- AppBox升级进行时 - 拥抱Entity Framework的Code First开发模式
AppBox 是基于 FineUI 的通用权限管理框架,包括用户管理.职称管理.部门管理.角色管理.角色权限管理等模块. 从Subsonic到Entity Framework Subsonic最早发布 ...
- Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)
很久没有写博客了,一些读者也经常问问一些问题,不过最近我确实也很忙,除了处理日常工作外,平常主要的时间也花在了继续研究微软的实体框架(EntityFramework)方面了.这个实体框架加入了很多特性 ...
- linq、lambda、entity framework之间的关系
lambda: 一种匿名委托的精简版写法,明显的标志是=>符号 entity framework(简称EF): 微软访问数据库的最快捷最成熟的框架(ORM),在EF出现以前有SqlHelper. ...
- 彻底征服 Entity Framework Core 优化!
作者 | 喵叔 责编 | 胡巍巍 出品 | CSDN(ID:CSDNnews) 这篇文章我们来讲解一下 Entity Framework Core 的优化方案.Entity Framework Cor ...
- 什么是Entity Framework
什么是Entity Framework Entity Framework是一个对象关系映射O/RM框架. Entity Framework让开发者可以像操作领域对象(domain-specific o ...
- ClownFish:比手写代码还快的通用数据访问层
最近花了二个月的业余时间重写了我以前的通用数据访问层, 由于是重写,所以我给这个项目取了个新名字:ClownFish 如果需要了解ClownFish的使用方法,请点击ClownFish 使用说明 Cl ...
最新文章
- 数值选择器(NumberPicker)的功能与用法
- cmyk图像处理matlab,数字图像处理及MATLAB实现 全套课件.pptx
- 滚动视差?CSS 不在话下
- 无需predetermine一条路
- 【Linux】一步一步学Linux——rm命令(32)
- 人工智能诗歌写作平台_智能写作VS人工写作,Giiso写作机器人解放你的创造力...
- 华科考研834计算机网络,2018年华中科技大学834计算机专业基础综合 (模)...
- mvn 使用中的错误
- (转)51单片机C中关于.c文件和.h文件
- erlang的cpu调优
- python基础知识学习笔记(1)
- AIR中使用FCKeditor
- carray 、clist、cmap
- cruise软件模型,混动仿真模型,IMMD架构混联混动仿真模型
- 邯郸市计算机中专学校地址,邯郸蓝天信息工程中专学校
- JAVAweb开发中Ajax教程
- LANP环境搭建(yum安装)
- uniapp数组已经更新到data页面不实时渲染问题
- 初学Linux服务器管理
- 手机怎么调整照片分辨率?照片清晰度dpi怎么调整?