ORM框架示例及查询测试,上首页修改版(11种框架)

继上次ORM之殇,我们需要什么样的ORM框架?

整理了11个ORM框架测试示例,通过示例代码和结果,能很容易了解各种框架的特性,优缺点,排名不分先后

  • EF
  • PDF
  • 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

测试目的

  1. 测试ORM数据访问性能,比较简单粗暴,统计对象映射转换和返回时间,(纯对象化的ORM用时会比用参数形式的ORM长)
  2. 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需单独修改

时间: 2024-12-14 19:41:28

ORM框架示例及查询测试,上首页修改版(11种框架)的相关文章

ORM框架示例及访问测试(10种框架)

继上次ORM之殇,我们需要什么样的ORM框架? 整理了10个ORM框架测试示例,排名不分先后 CRL EF PDF XCODE NHibernate MySoft Moon Cyq Dapper IBatisNet 上面的框架里,风格不一,多数为半对象化,需要以参数形式传值,效率可能高点,但编程性和便捷性就会差点 目的 测试ORM数据访问性能,比较简单粗暴,统计对象映射转换和返回时间,(纯对象化的ORM用时会比用参数形式的ORM长) ORM开发调用实现方式,不同ORM开发风格和便捷性一目了然 测

ORM for Net主流框架汇总与效率测试

框架已经被越来越多的人所关注与使用了,今天我们就来研究一下net方面的几个主流ORM框架,以及它们的效率测试(可能会有遗漏欢迎大家讨论). ORM框架:Object/Relation Mapping(对象/关系 映射)的缩写,易于理解的模型化数据的方法.简单的说就是把数据库的关系型数据类型转换为用对象型程序控制的框架类型. 今天研究的orm框架如下: 1.NHibernate(使用与介绍:http://www.cnblogs.com/stone_w/archive/2011/09/15/2177

Rafy 框架 - 使用 SqlTree 查询

本文介绍如何使用 Rafy 框架中的 Sql Tree 查询: 除了开发者常用的 Linq 查询,Rafy 框架还提供了 Sql 语法树的方式来进行查询. 这种查询方式下,开发者不需要直接编写真正的 Sql 语句,而是转而使用一套中间 Sql 语法树对象.这隔离了与具体数据库的耦合,使得开发者编写的查询可以跨越多种不同的数据库运行,甚至可以在非关系型数据库中运行.同时,框架还结合托管属性,提供了方便开发者使用的 API,并尽量保持与传统 Sql 相近的语法,使得开发者可以快速理解并编写. 本文包

从零开始编写自己的C#框架(24)——测试

导航 1.前言 2.不堪回首的开发往事 3.测试推动开发的成长——将Bug消灭在自测中 4.关于软件测试 5.制定测试计划 6.编写测试用例 7.执行测试用例 8.发现并提交Bug 9.开发人员修复Bug 10.对已修复Bug进行返测 11.将修复完成的Bug关闭,对未修复的Bug重新激活 12.灵活使用压力测试工具 13.测试与版本控制 14.小结 15.附件下载 1.前言 对于测试,很多公司并不看重,接触过不少朋友或客户,打开网站随便点击一下,就可以很容易发现爆黄页.404.UI变型(浏览器

如何开发一个java开源框架-----Jvn框架之实现文件的上传以及方法封装(第六讲)八哥实力讲解

前言 一 . 博主正在教大家如何开发一个javaEE框架(Jvn框架),博客里有完整的开发视频,每一篇博文都是一个知识点,帮助大家理解框架: 博客首页:http://www.cnblogs.com/everxs/ 本次内容视频以及源码下载地址:http://pan.baidu.com/s/1pJsoGDd 1,为什么要使用java的框架,以及框架能带来什么好处.  2,帮助你们理解框架的原理. 3,框架是如何实现的.                                        

Android自动化框架 模拟操作 模拟测试

转自:http://bbs2.c114.net/home.php?mod=space&uid=1025779&do=blog&id=5322 几种常见的Android自动化测试框架及其应用 随着Android应用得越来越广,越来越多的公司推出了自己移动应用测试平台.例如,百度的MTC.东软易测云.Testin云测试平台…….由于自己所在项目组就是做终端测试工具的,故抽空了解了下几种常见的基于UI层面的自动化测试工具.趁晚上有空总结下,好记心不如烂笔头呀! 一 常见Android自动

Django框架08 /聚合查询、分组、F查询和Q查询、执行原生sql、设置 sql_mode

目录 Django框架08 /聚合查询.分组.F查询和Q查询.执行原生sql.设置 sql_mode 1.聚合查询 2.分组 3.F查询和Q查询 4.执行原生sql(了解) 5.展示sql的 6.设置 sql_mode Django框架08 /聚合查询.分组.F查询和Q查询.执行原生sql.设置 sql_mode 1.聚合查询 aggregate(*args, **kwargs) aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典.键的名称是聚合值

什么样的博文才能上首页呢?『博客使用技巧』

你是否希望自己写的博文被同行关注?你是否希望自己的博文在博客首页显示?现在你的机会来啦.只要你申请就有机会上首页噢~ 那什么样的文章能够上首页呢?就让我们来看看上首页的参考标准~ 1.内容与观点的原创性.避免与网络上的技术教程或白皮书内容雷同,文章主题与内容凸显自己的观点. 正面示例: http://2379500.blog.51cto.com/2369500/438639 <浅谈算法,一些感悟(1)> 反面示例:http://paulxj.blog.51cto.com/855805/4501

有人说查询语句上加1=1会导致SQL低效,实际情况有么有影响呢?

无意中看到别人说sql语句加where 1=1会低效,所以就测试下: 新建测试表: USE [gk4] GO /****** 对象: Table [dbo].[Table_1] 脚本日期: 07/18/2014 15:34:02 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[Table_1]( [refId] [int] IDENTITY(1,