ORM框架示例及查询测试,上首页修改版(11种框架)
整理了11个ORM框架测试示例,通过示例代码和结果,能很容易了解各种框架的特性,优缺点,排名不分先后
- EF
- XCODE
- CRL
- NHibernate
- MySoft
- Moon
- Cyq
- Dapper
- IBatisNet
- LoognOrm
框架风格
- 完全对象化,以Linq&Lambda语法为依托 EF,CRL,NHibernate
- 只有结果对象化,Cyq,Dapper,IBatisNet,LoognOrm,PDF(以方法参数形式传递条件)
- 使用代理类实现自定义语法 Moon,MySoft,XCODE(需要生成代理类,构造自已的查询语法)
 语法实现方式也有很多种,详细可看测试类调用,便捷性也会有很大区别
上面的框架里,以参数形式传值,效率可能高点,但编程性和便捷性就会差点
部署配置
- 需供助工具生成MODEL Moon,MySoft,PDF,XCODE
- 需要定义对象映射 NHibernate,IBatisNet,IBatisNet配置起来很麻烦
- 只需写MODEL EF,CRL,Cyq,Dapper,LoognOrm
开放数据连接
有些ORM只提供了从config文件读取数据连接,这样做很是不方便(最新版有没有不知)
不能以编程方式实现的有 IBatisNet,Moon,PDF,XCODE
测试目的
- 测试ORM数据访问性能,比较简单粗暴,统计对象映射转换和返回时间,(纯对象化的ORM用时会比用参数形式的ORM长)
- ORM开发调用实现方式,不同ORM开发风格和便捷性一目了然
测试结果
- EF和NHibernate平均下来稍慢点,其它区别不大
- 实现方式纯对象化操作的ORM会更方便点
- 需要手动映射对象的开发起来会更麻烦
测试实现
为了体现ORM过程,尽量使用对象来表示
各种ORM属性实现方式可能不一样,所以定义成了接口
实体接口
public interface IProduct
{
int Id { get; set; }
string ProductId { get; set; }
string ProductName { get; set; }
string BarCode { get; set; }
DateTime AddTime { get; set; }
}
测试接口
这里只定义了参数index,在方法里按index创建对应的对象
public interface ITester
{
IProduct GetProduct(int index);
string Remark { get; }
bool Insert(int index);
int Select(int index);
int Update(int index);
int Delete(int index);
}
接口实现示例
为了测试ORM性能,尽量不拼接SQL,这将直接影响结果
public class CRLTester : ITester
{
public string Remark
{
get
{
return "";
}
}
public IProduct GetProduct(int index)
{
return new Product() { Id = index, ProductName = "ProductName" + index, BarCode = "BarCode" + index, AddTime = DateTime.Now };
}
public bool Insert(int index)
{
var data = GetProduct(index) as Product;
ProductManage.Instance.Add(data);
return true;
} public int Select(int index)
{
var data = GetProduct(index) as Product;
var list = ProductManage.Instance.QueryList(b => b.ProductName == data.ProductName);
return list.Count;
} public int Delete(int index)
{
var data = GetProduct(index) as Product;
var n = ProductManage.Instance.Delete(b => b.Id == data.Id);
return n;
} public int Update(int index)
{
var data = GetProduct(index) as Product;
//因为不是查询出来的,手动设置哪些属性被更改了
data.Change(b => b.ProductName);
data.Change(b => b.BarCode);
return ProductManage.Instance.Update(data);
}
}
测试过程,调用接口实现,对增删改查循环执行指定次数
static string DoTest(ITester tester, TestType type,int n)
{
Stopwatch sw = new Stopwatch();
//插入
sw.Start();
for (int i = 1; i <= n; i++)
{
switch (type)
{
case TestType.DELETE:
tester.Delete(i);
break;
case TestType.INSERT:
tester.Insert(i);
break;
case TestType.SELECT:
tester.Select(i);
break;
case TestType.UPDATE:
tester.Update(i);
break;
}
}
sw.Stop();
var times = sw.ElapsedMilliseconds;
var avg = times / Convert.ToDouble(n);
return string.Format("{0},用时 {1} 毫秒 平均 {2}", type, sw.ElapsedMilliseconds, avg);
}
使用本地数据库local测试,结果如下(仅供参考)
EF 100次 开始测试 2015/4/13 16:28:48
INSERT,用时 1459 毫秒 平均 14.59
SELECT,用时 555 毫秒 平均 5.55
UPDATE,用时 483 毫秒 平均 4.83
DELETE,用时 178 毫秒 平均 1.78
===================================
CRL 100次 开始测试 2015/4/13 16:28:54
INSERT,用时 144 毫秒 平均 1.44
SELECT,用时 190 毫秒 平均 1.9
UPDATE,用时 81 毫秒 平均 0.81
DELETE,用时 172 毫秒 平均 1.72
===================================
PDF 100次 开始测试 2015/4/13 16:28:58
INSERT,用时 173 毫秒 平均 1.73
SELECT,用时 129 毫秒 平均 1.29
UPDATE,用时 153 毫秒 平均 1.53
DELETE,用时 51 毫秒 平均 0.51
===================================
XCODE 100次 开始测试 2015/4/13 16:29:01
INSERT,用时 432 毫秒 平均 4.32
SELECT,用时 146 毫秒 平均 1.46
UPDATE,用时 172 毫秒 平均 1.72
DELETE,用时 123 毫秒 平均 1.23
===================================
NHibernate 100次 开始测试 2015/4/13 16:29:11
INSERT,用时 317 毫秒 平均 3.17
SELECT,用时 482 毫秒 平均 4.82
UPDATE,用时 155 毫秒 平均 1.55
DELETE,用时 178 毫秒 平均 1.78
===================================
MySoft 100次 开始测试 2015/4/13 16:29:15
INSERT,用时 374 毫秒 平均 3.74
SELECT,用时 309 毫秒 平均 3.09
UPDATE,用时 318 毫秒 平均 3.18
DELETE,用时 247 毫秒 平均 2.47
===================================
Moon 100次 开始测试 2015/4/13 16:29:19
INSERT,用时 185 毫秒 平均 1.85
SELECT,用时 105 毫秒 平均 1.05
UPDATE,用时 81 毫秒 平均 0.81
DELETE,用时 127 毫秒 平均 1.27
===================================
Cyq 100次 开始测试 2015/4/13 16:29:24
INSERT,用时 225 毫秒 平均 2.25
SELECT,用时 131 毫秒 平均 1.31
UPDATE,用时 63 毫秒 平均 0.63
DELETE,用时 304 毫秒 平均 3.04
===================================
Dapper 100次 开始测试 2015/4/13 16:29:28
INSERT,用时 141 毫秒 平均 1.41
SELECT,用时 125 毫秒 平均 1.25
UPDATE,用时 57 毫秒 平均 0.57
DELETE,用时 80 毫秒 平均 0.8
===================================
IBatisNet 100次 开始测试 2015/4/13 16:29:32
INSERT,用时 162 毫秒 平均 1.62
SELECT,用时 111 毫秒 平均 1.11
UPDATE,用时 60 毫秒 平均 0.6
DELETE,用时 94 毫秒 平均 0.94
===================================
LoognOrm 100次 开始测试 2015/4/13 16:29:37
INSERT,用时 109 毫秒 平均 1.09
SELECT,用时 94 毫秒 平均 0.94
UPDATE,用时 96 毫秒 平均 0.96
DELETE,用时 57 毫秒 平均 0.57
===================================
EF插入表现得非常慢,可能是由于它的机制引起的
在上面说的,没有使用语法解析的ORM,用时相对比较短,其它差不多
影响效率的原因
- 框架内部机制,比如EF,Insert奇慢
- 对象映射和语法解析时间 ,对象和表映射转换,查询语法解析
- 生成的语句复杂度和参数化
运行截图

以上结果仅作参考,以实际测试结果为准,欢迎留言讨论
测试项目下载地址:http://files.cnblogs.com/files/hubro/ORMTest.rar?a=2
请更改config文件中的数据连接,IBatisNet需单独修改
ORM框架示例及查询测试,上首页修改版(11种框架)的更多相关文章
- Java自动化测试框架-10 - TestNG之测试结果篇
		1.-测试结果 1.1-成功,失败和断言 测试被认为是成功的,如果它不引发任何异常完成,还是它扔的预期异常(请参阅文档expectedExceptions属性上找到的@Test注释). 您的测试方法通 ... 
- ORM for Net主流框架汇总与效率测试
		框架已经被越来越多的人所关注与使用了,今天我们就来研究一下net方面的几个主流ORM框架,以及它们的效率测试(可能会有遗漏欢迎大家讨论). ORM框架:Object/Relation Mapping( ... 
- ORM常用字段及查询
		目录 ORM常用字段及参数 创建表 ORM常用字段 ORM字段参数 ORM表关系创建 ForeignKey OneToOneField ManyToManyField 多对多三种创建方式 单表查询 q ... 
- 28款GitHub最流行的开源机器学习项目,推荐GitHub上10 个开源深度学习框架
		20 个顶尖的 Python 机器学习开源项目 机器学习 2015-06-08 22:44:30 发布 您的评价: 0.0 收藏 1收藏 我们在Github上的贡献者和提交者之中检查了用Python语 ... 
- 从零开始编写自己的C#框架(24)——测试
		导航 1.前言 2.不堪回首的开发往事 3.测试推动开发的成长——将Bug消灭在自测中 4.关于软件测试 5.制定测试计划 6.编写测试用例 7.执行测试用例 8.发现并提交Bug 9.开发人员修复B ... 
- Rafy 框架 - 使用 SqlTree 查询
		本文介绍如何使用 Rafy 框架中的 Sql Tree 查询: 除了开发者常用的 Linq 查询,Rafy 框架还提供了 Sql 语法树的方式来进行查询. 这种查询方式下,开发者不需要直接编写真正的 ... 
- TOGAF架构内容框架之架构制品(上)
		TOGAF架构内容框架之架构制品(上) 4. 架构制品(Architectural Artifacts) 架构制品是针对某个系统或解决方案的模型描述,与架构交付物和构建块相比,架构制品既不是架构开发方 ... 
- 使用cglib实现数据库框架的级联查询
		写在前面的 这一章是之前写的<手把手教你写一个Java的orm框架> 的追加内容.因为之前写的数据库框架不支持级联查询这个操作,对于有关联关系的表用起来还是比较麻烦,于是就准备把这个功能给 ... 
- Android自动化框架 模拟操作 模拟测试
		转自:http://bbs2.c114.net/home.php?mod=space&uid=1025779&do=blog&id=5322 几种常见的Android自动化测试 ... 
随机推荐
- QComboBox的activated与currentIndexChanged的区别
			void activated ( int index ) void activated ( const QString & text ) 信号activated是只要单击选择框即使所选内容选择 ... 
- ThreadPoolExecutor源码学习(1)-- 主要思路
			ThreadPoolExecutor是JDK自带的并发包对于线程池的实现,从JDK1.5开始,直至我所阅读的1.6与1.7的并发包代码,从代码注释上看,均出自Doug Lea之手,从代码上看JDK1. ... 
- 在C#中调用EXE文件
			1. 如果exe文件的返回值是int类型,标识操作执行的结果是否成功,例如: class Program { static int Main(string[] args) { return args. ... 
- spring和Hibernate整合
			首先导入spring和Hibernate的jar包,以及JDBC和c3p0的jar包, 然后就是Hibernate的XML配置文件,不需要加入映射文件,这里用spring容器管理了. Hibernat ... 
- pythonchallenge 解谜 Level 8
			#-*- coding:utf-8 -*- #代码版本均为python 3.5.1 #Level 7 import bz2 un=b'BZh91AY&SYA\xaf\x82\r\x00\x00 ... 
- 公司培训 oracle( 第一天)
			以前在学校学习Oracle的时候就对rowid 和rownum 这两个伪列有很大的疑惑,今天公司对16届新员工进行公司内部技术培训,课堂上的讲解,又让我想起来了曾经的疑惑点, 我想不能在让这个疑惑继续 ... 
- 带额外toggle()功能的jquery库
			<html><head><meta http-equiv="Content-Type" content="text/html;charset ... 
- android-plugmgr源代码分析
			android-plugmgr是一个Android插件加载框架,它最大的特点就是对插件不需要进行任何约束.关于这个类库的介绍见作者博客,市面上也有一些插件加载框架,但是感觉没有这个好.在这篇文章中,我 ... 
- MySQL 复制表结构
			200 ? "200px" : this.width)!important;} --> 介绍 有时候我们需要原封不动的复制一张表的表结构来生成一张新表,MYSQL提供了两种便 ... 
- Android动画小记录
			今天在做一个头部滑动菜单的时候需要使用TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYD ... 
