测试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# List<T> 合并、去重、查找
List<,,,,,}; List<,,,,}; listA.AddRange(listB );//把集合A.B合并 List<int> Result = listA.Unio ...
- C++ 字符处理函数
C/C++里有一个头文件#include <ctype.h>,里面定义了很多字符函数,在实际开发中,用起来很方面. int isalpha(int ch) 若ch是字母('A'-'Z', ...
- 3.1 AngularJS必备知识
AngularJS是一个WEB应用框架. 本节我们会学习控制器(控制数据),会学习作用域(连接控制器和用户界面),用户界面又叫做视图,通过模板和作用域来创建交互视觉效果.另外,我们还会学习其他的特性比 ...
- 使用Docker搭建Java Web运行环境
这周末体验了一下挺火的Docker技术,记录学习笔记. >Docker是干什么的 Docker 是一个基于Linux容器(LXC-linux container)的高级容器引擎,基于go语言开发 ...
- to_char函数
TO_CHAR 是把日期或数字转换为字符串,不能指定字符串长度. 使用TO_CHAR函数处理日期:TO_CHAR(number, '格式') eg:TO_CHAR(salary,'$99,999.99 ...
- 详细讲述MySQL中的子查询操作 (来自脚本之家)
继续做以下的前期准备工作: 新建一个测试数据库TestDB: ? 1 create database TestDB; 创建测试表table1和table2: ? 1 2 3 4 5 6 7 8 9 1 ...
- linux 负载均衡
[博文推荐]关于负载均衡技术使用的一些误区 如今,负载均衡已经不是一个新鲜的词,也不是什么新技术,主要用于解决单机负载能力的局限性,但问题是你的应用真的到了单 机的负载上限了吗,未必,很多不知道如何推 ...
- Shell_2 语句
1 if else fi if 语句通过关系运算符判断表达式的真假来决定执行哪个分支.Shell 有三种 if ... else 语句: if ... fi 语句: if ... else ... f ...
- 《转》Unity3D研究院编辑器之5.3JSON的序列化
Unity5.3 的一项新功能就是Json的序列化,支持嵌套使用,可以把json字符串转成对象,把对象转成json字符串. using UnityEngine; using UnityEditor; ...
- css3之3D魔方动画(小白版)
在这里分享一下3D魔方动画,html5+CSS3即可完成~无图无真相,先上效果图 第一步非常简单,就是先将魔方的结构画出来.大家都玩过魔方,知道魔方是一个有六个面的正方体.这里我们先写一个大的di ...