测试EF6.1.3和OrmLite性能
公司原来用nhibernate,现在考虑要不要换一种ORM,于是找来了EF和ServiceStack.OrmLite。所以就产生了测试这三个性能的要求。对比三个ORM工具的性能,主要是对比ORM配置和启动速度;建表速度;插入行速度;修改行速度以及查询速度,删除用的比较少,就不测试了,还有发现EF貌似比nhibernate稍微快一些,就只测EF和ServiceStack.OrmLite了。
测试表结构
public class School
{
public Guid ID { get; set; }
public string Name { get; set; }
public int AllPersonCount { get; set; }
}
public class Person
{
public long ID { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public School InShool { get; set; }
}
测试项目
1. 插入10个学校, 学校人数从1递增,名称相同为”SSS”
2. 每个学校插入1000人,年龄从1递增,名字相同”PPP”,并返回ID
3. 查询年龄大于30的人
4. 更新3查询出的人的年龄到当前值加20
5. 查询学校人数大于5的所有人
6. 统计学校人数大于5的所有人的人数
代码原则
1. 尽量简洁
2. 不能使用sql语句
写测试代码
nhibernate是由另一个家伙搞,我就写EF的测试代码。首先新建一个控制台应用程序,右键项目管理NuGet添加EF6.1.3。然后新建那两个表对应的类,接着就开始一个个写啦。下面每种的两个代码段上面的是EF的,下面的是ServiceStack.OrmLite的
ORM配置及启动
watch.Start();
db = new TestContext();
watch.Stop();
Console.WriteLine("ORM配置及启动:" + watch.ElapsedMilliseconds);
watch.Start();
OrmLiteConfig.DialectProvider = SqlServerDialect.Provider;
string connStr = ConfigurationManager.ConnectionStrings["SSConnection"].ConnectionString;
db = connStr.OpenDbConnection();
watch.Stop();
Console.WriteLine("ORM配置及启动:" + watch.ElapsedMilliseconds);
建表
watch.Restart();
db.Database.Initialize(true);
watch.Stop();
Console.WriteLine("建表:" + watch.ElapsedMilliseconds);
watch.Restart();
db.CreateTable<School>();
db.CreateTable<Person>();
watch.Stop();
Console.WriteLine("建表:" + watch.ElapsedMilliseconds);
测试项目1
db.Configuration.AutoDetectChangesEnabled = false;
db.Configuration.ValidateOnSaveEnabled = false;
watch.Restart(); for (int i = ; i < ; i++)
{
db.School.Add(new School
{
ID = Guid.NewGuid(),
Name = "SSS",
AllPersonCount = i
});
} db.SaveChanges();
watch.Stop();
Console.WriteLine("测试项目1:" + watch.ElapsedMilliseconds);
watch.Restart();
var schools = new List<School>(); for (int i = ; i < ; i++)
{
schools.Add(new School
{
ID = Guid.NewGuid(),
Name = "SSS",
AllPersonCount = i
});
} db.InsertAll(schools);
watch.Stop();
Console.WriteLine("测试项目1:" + watch.ElapsedMilliseconds);
测试项目2
watch.Restart();
List<School> schools = db.School.ToList(); schools.ForEach(o =>
{
for (int i = ; i < ; i++)
{
db.Person.Add(new Person
{
Age = i,
Name = "PPP",
InShool = o
});
}
}); db.SaveChanges();
watch.Stop();
Console.WriteLine("测试项目2:" + watch.ElapsedMilliseconds);
schools = db.LoadSelect<School>();
watch.Restart();
var students = new List<Person>(); schools.ForEach(o =>
{
for (int i = ; i < ; i++)
{
students.Add(new Person
{
Age = i,
Name = "PPP",
ShoolID = o.ID
});
}
}); db.InsertAll(students);
watch.Stop();
Console.WriteLine("测试项目2:" + watch.ElapsedMilliseconds);
测试项目3
db.Configuration.AutoDetectChangesEnabled = true;
watch.Restart();
List<Person> person = db.Person.Where(o => o.Age > ).ToList();
watch.Stop();
Console.WriteLine("测试项目3:" + watch.ElapsedMilliseconds);
watch.Restart();
List<Person> persons = db.Select<Person>(x => x.Age > );
watch.Stop();
Console.WriteLine("测试项目3:" + watch.ElapsedMilliseconds);
测试项目4
watch.Restart();
person.ForEach(o => o.Age += );
db.SaveChanges();
watch.Stop();
Console.WriteLine("测试项目4:" + watch.ElapsedMilliseconds);
watch.Restart();
persons.ForEach(o => o.Age += );
db.UpdateAll(persons);
watch.Stop();
Console.WriteLine("测试项目4:" + watch.ElapsedMilliseconds);
测试项目5
watch.Restart();
List<Person> students = db.Person.AsNoTracking().Where(o => o.InShool.AllPersonCount > ).ToList();
watch.Stop();
Console.WriteLine("测试项目5:" + watch.ElapsedMilliseconds);
watch.Restart();
students = db.Select(
db.From<Person>()
.Join<School>((p, s) => p.ShoolID == s.ID)
.Where<School>(s => s.AllPersonCount > )
);
watch.Stop();
Console.WriteLine("测试项目5:" + watch.ElapsedMilliseconds);
测试项目6
watch.Restart();
int count = db.Person.Count(o => o.InShool.AllPersonCount > );
watch.Stop();
Console.WriteLine("测试项目6:" + watch.ElapsedMilliseconds);
watch.Restart();
long count = db.Count(
db.From<Person>()
.Join<School>((p, s) => p.ShoolID == s.ID)
.Where<School>(s => s.AllPersonCount > )
);
watch.Stop();
Console.WriteLine("测试项目6:" + watch.ElapsedMilliseconds);
这里要说明一下的是测试项目5和6的人数大于5是说学校表的AllPersonCount大于5,而且那个字段并不是真的学生总人数,不会随学生的增加而增加,只是为了测试的。
EF运行3次的截图如下:

ServiceStack.OrmLite运行3次的截图如下:

接下来要开大招了,学校从加10个改为加100个,这样的话学生就会从10000个增加到100000个,插入10万行的时候nhibernate直接顶不住了。
EF运行3次的截图如下:

ServiceStack.OrmLite运行3次的截图如下:

需要说明的是数据库是mssql2008,并且程序和数据库都在本机,不同的电脑的性能不一样,数据库不一样也会影响测试的结果,所以大家如果要对比其他ORM工具的话,需要把多个程序在同一个电脑上运行,并且连接同一个数据库。通过对比可以发现,轻量级的OrmLite最快,EF和nhiberate差不多快,EF稍占优势。不过并发能力的话倒是还没测试过,不知道那个更好。
示例代码下载
TestEF6.1.3
TestOrmLite
测试EF6.1.3和OrmLite性能的更多相关文章
- ormlite性能对比
看了一下现在的android设备,性能都不差,就懒得直接用sqlite,直接上ORM框架把,上网搜了一圈,觉得androrm, ormlite 这两个不错,当然,还有点别的,这里就不多做介绍,竟然说明 ...
- PHP中测试in_array、isset、array_key_exists性能
测试in_array.isset.array_key_exists性能.自己写的简易测试代码: ini_set('display_errors',true); error_reporting(E_AL ...
- 有谁知道什么工具测试IOS手机上APP的性能软件啊?
有谁知道什么工具测试IOS手机上APP的性能软件啊?
- 性能测试--测试流程、APDEX、linux性能知识
测试流程.APDEX.linux性能知识 一.性能测试流程: 整体流程:收集需求-->搭建测试环境-->设计性能测试场景-->开发测试脚本-->执行测试-->收集数据-- ...
- python环境测试MySQLdb、DBUtil、sqlobject性能
python环境测试MySQLdb.DBUtil.sqlobject性能 首先介绍下MySQLdb.DBUtil.sqlobject: (1)MySQLdb 是用于Python连接Mysql数据库的接 ...
- 即使用ADO.NET,也要轻量级动态生成更新SQL,比Ormlite性能更高
先上测试结果: //测试1000次针对同一个表同一个字段更新,比Ormlite平均快2.34倍 //生成SQL+ExecuteNonQuery Ormlite 倍数 //6513ms 15158ms ...
- 【Android测试】【第一节】性能——CPU
◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5065083.html 前言 本来打算写完全部的自动化测试之 ...
- 测试canvas绘制旋转文字的性能
canvas 绘制各种动画效果时,我们经常会使用画布旋转,使绘制上去的元素有旋转的效果. 最近在项目中碰到了很严重的性能问题,经常排查发现是因为绘制批量文字时使用了画布旋转,且每行文字的旋转角度是不一 ...
- 【Android测试】【第二节】性能——CPU时间片
◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5143192.html 前言 第一节讲CPU的时候留下了一个 ...
随机推荐
- gdb调试汇编堆栈过程的学习
gdb调试汇编堆栈过程的学习 以下为C源文件 使用gcc - g code.c -o code -m32指令在64位的机器上产生32位汇编,然后使用gdb example指令进入gdb调试器: 进入之 ...
- Ubuntu实用小指令
1.Ubuntu命令行下打开图形界面的文件夹 可以使用 nautilus path 为使用方便,可以给命令nautilus加一个别名cd /home/usernamevi .bash_aliases在 ...
- (转载)org.springframework.web.context.ContextLoaderListener
http://www.yihaomen.com/article/java/471.htm 刚才手贱乱点了下,然后好像jar包不见了还是什么的,出现了这个错误,按照帖子说的,手动添加maven进去就好了
- width:100%;与width:auto;的区别
<div> <p>1111</p> </div> div{ width:980px; background-color: #ccc; height:30 ...
- QT插件使用
1基本插件制作流程 1) 定义接口.接口定义为抽象基类,如IPluginInterface,实现高度封装.定义的头文件在最后需要通过Q_DECLARE_INTERFACE来唯一标识该接口,即通过一个全 ...
- ajax循环读取json多维数组
test.json: { "one": [ { "name": "黑默丁格", "car": "鲁LLL608 ...
- Linux时间同步,ntpdate命令、ntpd服务详解
声明:以下内容来自网友整理(http://blog.sina.com.cn/s/blog_636a55070101u1mg.html),为便于以后学习暂时收录,请不要随意转载 Linux默认情况下,系 ...
- httpclient 使用方式介绍
第一:Get方式请求 package com.hct; import java.io.BufferedReader; import java.io.IOException; import java.i ...
- 给hadoop新手的一封信:Hadoop入门自学及对就业的帮助
学习指南,刚接触这个确实有点懵逼,感觉还有很多东西要学要看,自己要逐渐构造成一个框架的体系. 附上一个学习博客地址: http://www.cnblogs.com/mephisto/p/4835386 ...
- 【Java EE 学习 74 上】【数据采集系统第六天】【使用Jfreechart的统计图实现】【Jfreechart的基本使用方法】
之前已经实现了数据的采集,现在已经有了基本的数据,下一步就需要使用这些数据实现统计图的绘制了.这里使用Jfreechart实现这些统计图的绘制.首先看一下Jfreechart的基本用法,只有知道了它的 ...