CYQ.Data数据框架的性能评测
最近有网友经常关注CYQ.Data的性能问题,虽然关注,但没发现谁主动的写过和其它框架的性能评测文章。
个人平常比较忙一些,这么长久以来,一直也没好好的为CYQ.Data写一个简单的性能测试。
今天,得为它写了一篇了。
杂七几句:
当很多人问我 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 |
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);
- }
原文出处:http://www.cnblogs.com/cyq1162/archive/2011/03/08/1977422.html
【编辑推荐】
相关文章
- 【技术种草】cdn+轻量服务器+hugo=让博客“云原生”一下
- CLB运维&运营最佳实践 ---访问日志大洞察
- vnc方式登陆服务器
- 轻松学排序算法:眼睛直观感受几种常用排序算法
- 十二个经典的大数据项目
- 为什么使用 CDN 内容分发网络?
- 大数据——大数据默认端口号列表
- Weld 1.1.5.Final,JSR-299 的框架
- JavaFX 2012:彻底开源
- 提升as3程序性能的十大要点
- 通过凸面几何学进行独立于边际的在线多类学习
- 利用行动影响的规律性和部分已知的模型进行离线强化学习
- ModelLight:基于模型的交通信号控制的元强化学习
- 浅谈Visual Source Safe项目分支
- 基于先验知识的递归卡尔曼滤波的代理人联合状态和输入估计
- 结合网络结构和非线性恢复来提高声誉评估的性能
- 最佳实践丨云开发CloudBase多环境管理实践
- TimeVAE:用于生成多变量时间序列的变异自动编码器
- 具有线性阈值激活的神经网络:结构和算法
- 内网渗透之横向移动 -- 从域外向域内进行密码喷洒攻击