测试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的时候留下了一个 ...
随机推荐
- c#线程间操作无效: 从不是创建控件“textBox1”的线程访问它
线程开始前: Control.CheckForIllegalCrossThreadCalls = false;
- JDBC连接数据库
JDBC连接数据库 1.加载JDBC驱动程序. Class.forName("com.mysql.jdbc.Driver"); 建立连接,. Connection conn = D ...
- 配置Samba共享服务器
安装samba: sudo apt-get install samba samba-common 由于是挂载另一个磁盘,并作为共享文件存放地: 列出磁盘名和ID air@air-device:~$ s ...
- js 字符串操作函数
concat() – 将两个或多个字符的文本组合起来,返回一个新的字符串. indexOf() – 返回字符串中一个子串第一处出现的索引.如果没有匹配项,返回 -1 . charAt() – 返回指定 ...
- 用markdown简化书写
引言 markdown是什么, 谁在使用markdown, 以及为什么我应该/不应该使用它? 我能从这篇文章中了解到什么, 怎么开始使用? markdown有两个含义: 一套标记语法(类比html,w ...
- Azure Site to Site VPN 配置手册
目录 1 Azure Site to Site VPN配置前的准备 1 1.1 设备兼容 1 1.2 网络要求和注意事项 1 2 配置Azure site t ...
- GDB的常用命令
定断点b line.会返回一个断点号(breakpoint-no). 输出p val.可以夹杂类型装换.解引用. 遇到断点自动执行命令commands breakpoint-no. 停止执行s. 退出 ...
- OpenCv ROI操作
Mat img, dst; Rect imgroi(, , img.cols, img.rows);//小图像img需要复制到大图的像素区域rect Rect dstroi(, , img.cols, ...
- Eclipse导入到最新版Android Studio详解
说到使用AndroidStudio,除了新建的项目,我们都会面临的问题是原先Eclipse的代码该怎么导入到AndroidStudio中使用.这方面相关的资料还比较少,自己摸索了一下,总结出这篇博客, ...
- github push时,要求密码的问题
整几次才搞的有点明白: 1 clone 项目 用 SSH: 在github 上如下图 2 C:\Users\<用户名> 下如果有 "_netrc" 文件: 如果含有 如 ...