开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1633|回复: 2
打印 上一主题 下一主题
收起左侧

[其它数据库例题] CYQ.Data数据框架的性能评测

[复制链接]

结帖率:61% (35/57)
跳转到指定楼层
发表于 2013-1-30 13:22:05 | 只看该作者 回帖奖励 |正序浏览 |阅读模式   海南省海口市
当很多人问我 CYQ.Data 性能怎样时,我说:比其它ORM的框架性能要好。

当然,我没有给出任何的测试数据来证明,因为我没用过其它框架,所以没法给出数据,所以只能任网友:爱信不信。

说比其它框架要好,当然不是因为卖瓜的赞瓜甜,而是基于以下的认知:

数据框架,正常都由这几个过程组成:外部表现形式封装->生成SQL->调用ADO.NET执行。

其中,ADO.NET执行上基本上一个样的,因此,框架的性能差异也就表现在外部形式的封装上和生成SQL的过程,性能差异多数取决于封装的复杂度。

而 CYQ.Data ,仅是在SQLHelper上多包装了一层,走的是原生的索引形式,所以从封装及生成SQL上的速度来说,是要比其它NHibernate、Spring.Net、Entity Framework、Linq等来的快些的。

因此,我也就简略的得出一个简单但不严谨的结论。

说明:

由于没有使用其它框架的习惯,故此处的评测,就不与其它框架做比较。

而将采用与原生的ADO.NET比较,测试CYQ.Data与原生框架的性能差异有多少。

懂其它框架的人,与原生ADO.NET一比,自然也可以得出和CYQ.Data的性能差异了。

本次测试仅测试写数据,测试代码将在后面显示。

一:写个循环调用插入数据看看结果先

1:插入10条数据:



2:插入100条数据:



3:插入1000条数据:



分析从上面3张图的数据中,暂时得出的结论是:

在数据量小的情况,CYQ.Data 的性能竟然比原生ADO.NET的还优越。

随着数据量往上升时,CYQ.Data 的性能开始下降。

结论疑问:

这个结论让人看着很迷惑,甚至是不太可能的,有几个疑点:

CYQ.Data 数据框架是基于ADO.NET封装的,怎么可能比ADO.NET执行的更快?
CYQ.Data 在循环次数增加时,性能就越来越下降?
CYQ.Data 的MAction表现比MProc差这么远的?
疑问解答,发现问题:

CYQ.Data 默认开启的事务机制,导致比示例中无事务的ADO.NET调用性能高了一些。
CYQ.Data 内部的DebugInfo属性,不断的循环自加记录执行的SQL语句致性能下降。就是通常人们经常测试的string与StringBuilder的区别。
MAction内部多了一次反填充,即插入后,根据ID查询数据填充了下行数据,所以测试对它是不太公平的。
二:公平测试

CYQ.Data:关闭调试信息、关闭事务、MAction关闭反填充。

同时为了避免由于执行顺序引起的性能影响,每个我都单独执行,执行后truncate表再执行另一条。

由于没有一起执行,就看不到一起输出的信息截图了,只能单独的复制结果下来了。

结果如下:

1:插入10条数据:

ADO.net [ADO.net]:0.15625[秒]--10
CYQ.Data[MProc##]:0.171875[秒]--10
CYQ.Data[MAction]:0.265625[秒]--10


2:插入100条数据:

ADO.net [ADO.net]:0.203125[秒]--100
CYQ.Data[MProc##]:0.234375[秒]--100
CYQ.Data[MAction]:0.3125[秒]--100

3:插入1000条数据:

ADO.net [ADO.net]:0.53125[秒]--1000
CYQ.Data[MProc##]:0.859375[秒]--1000
CYQ.Data[MAction]:1.015625[秒]--1000


分析从上面三组数据中,我们看出:

CYQ.Data 的性能基本维持和ADO.NET相差无几,在数据量上升到时1000时,也仅是2倍不到的差距。

由此说明,CYQ.Data 在性能上,是相当接近原始的ADO.NET,原因就在于,它并没有过多去封装ADO.NET。

仅是简单的封装,却能使用如此简便,这就是它区别其它框架最大的优势所在。

当然,这仅是一个小的测试,不能代表总体来做严谨的解答。

但,在某方面,也算是给对此框架性能有疑问的网友,作了一点解答。

至少,它还是值得你拥有的。

下载地址:http://www.cyqdata.com/download/article-detail-426

三:测试的代码示例:

1:原始的ADO.NET测试代码:

public static void ADO_NET()  {      DateTime start = DateTime.Now;      SqlConnection con = new SqlConnection("server=.;database=abc;uid=sa;pwd=123456");      SqlCommand com = new SqlCommand();      com.Connection = con;      com.CommandText = "insert into Users(UserName,Password) values(@UserName,@Password)";      con.Open();      for (int i = 0; i < count; i++)      {         com.Parameters.Clear();         com.Parameters.AddWithValue("@UserName", "U_" + System.Threading.Thread.CurrentThread.ManagedThreadId);         com.Parameters.AddWithValue("@Password", "P_" + i);         if (com.ExecuteNonQuery() > -1)         {            ok2++;         }      }      con.Close();      TimeSpan ts = DateTime.Now - start;      Console.WriteLine("ADO.net [ADO.net]:" + ts.TotalSeconds + "[秒]--" + ok2);  }  2:CYQ.Data 的MProc测试代码:

public static void MProc()  {      DateTime start = DateTime.Now;      MProc proc = new MProc("insert into Users(UserName,Password) values(@UserName,@Password)");      proc.EndTransation();//关闭事务      for (int i = 0; i < count; i++)      {         proc.Clear();         proc.Set("@UserName", "U_" + System.Threading.Thread.CurrentThread.ManagedThreadId);         proc.Set("@Password", "P_" + i);         if (proc.ExeNonQuery() > -1)         {             ok3++;         }      }      proc.Close();      TimeSpan ts = DateTime.Now - start;      Console.WriteLine("CYQ.Data[MProc##]:" + ts.TotalSeconds + "[秒]--" + ok3);  }  3:CYQ.Data 的MAction测试代码:

public static void MAction()  {      DateTime start = DateTime.Now;      MAction action = new MAction("Users");      action.EndTransation();//关闭事务      for (int i = 0; i < count; i++)      {         action.Set("UserName", "U_" + System.Threading.Thread.CurrentThread.ManagedThreadId);         action.Set("Password", "P_" + i);         if (action.Insert())         {             ok++;         }      }      action.Close();      TimeSpan ts = DateTime.Now - start;      Console.WriteLine("CYQ.Data[MAction]:" + ts.TotalSeconds + "[秒]--" + ok);  }     

结帖率:37% (7/19)
沙发
发表于 2013-2-7 09:44:40 | 只看该作者   北京市北京市
不懂                       
回复 支持 反对

使用道具 举报

楼主
发表于 2013-1-30 14:17:31 | 只看该作者   四川省成都市
抄文章你也注意下格式撒..
这个东西是个鸡肋
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:[email protected]
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表