CYQ.Data数据框架的性能评测

数据库
最近有网友经常关注CYQ.Data的性能问题,虽然关注,但没发现谁主动的写过和其它框架的性能评测文章。笔者在这里为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 的性能开始下降。

结论疑问:

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

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

疑问解答,发现问题:

  1. CYQ.Data 默认开启的事务机制,导致比示例中无事务的ADO.NET调用性能高了一些。
  2. CYQ.Data 内部的DebugInfo属性,不断的循环自加记录执行的SQL语句致性能下降。就是通常人们经常测试的string与StringBuilder的区别。
  3. 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测试代码:

  1. public static void ADO_NET()  
  2. {  
  3.     DateTime start = DateTime.Now;  
  4.     SqlConnection con = new SqlConnection("server=.;database=abc;uid=sa;pwd=123456");  
  5.     SqlCommand com = new SqlCommand();  
  6.     com.Connection = con;  
  7.     com.CommandText = "insert into Users(UserName,Password) values(@UserName,@Password)";  
  8.     con.Open();  
  9.     for (int i = 0; i < count; i++)  
  10.     {  
  11.        com.Parameters.Clear();  
  12.        com.Parameters.AddWithValue("@UserName""U_" + System.Threading.Thread.CurrentThread.ManagedThreadId);  
  13.        com.Parameters.AddWithValue("@Password""P_" + i);  
  14.        if (com.ExecuteNonQuery() > -1)  
  15.        {  
  16.           ok2++;  
  17.        }  
  18.     }  
  19.     con.Close();  
  20.     TimeSpan ts = DateTime.Now - start;  
  21.     Console.WriteLine("ADO.net [ADO.net]:" + ts.TotalSeconds + "[秒]--" + ok2);  
  22. }  

 2:CYQ.Data 的MProc测试代码:

  1. public static void MProc()  
  2. {  
  3.     DateTime start = DateTime.Now;  
  4.     MProc proc = new MProc("insert into Users(UserName,Password) values(@UserName,@Password)");  
  5.     proc.EndTransation();//关闭事务  
  6.     for (int i = 0; i < count; i++)  
  7.     {  
  8.        proc.Clear();  
  9.        proc.Set("@UserName""U_" + System.Threading.Thread.CurrentThread.ManagedThreadId);  
  10.        proc.Set("@Password""P_" + i);  
  11.        if (proc.ExeNonQuery() > -1)  
  12.        {  
  13.            ok3++;  
  14.        }  
  15.     }  
  16.     proc.Close();  
  17.     TimeSpan ts = DateTime.Now - start;  
  18.     Console.WriteLine("CYQ.Data[MProc##]:" + ts.TotalSeconds + "[秒]--" + ok3);  
  19. }  

3:CYQ.Data 的MAction测试代码:

  1. public static void MAction()  
  2. {  
  3.     DateTime start = DateTime.Now;  
  4.     MAction action = new MAction("Users");  
  5.     action.EndTransation();//关闭事务  
  6.     for (int i = 0; i < count; i++)  
  7.     {  
  8.        action.Set("UserName""U_" + System.Threading.Thread.CurrentThread.ManagedThreadId);  
  9.        action.Set("Password""P_" + i);  
  10.        if (action.Insert())  
  11.        {  
  12.            ok++;  
  13.        }  
  14.     }  
  15.     action.Close();  
  16.     TimeSpan ts = DateTime.Now - start;  
  17.     Console.WriteLine("CYQ.Data[MAction]:" + ts.TotalSeconds + "[秒]--" + ok);  
  18. }  
  19.    

原文出处:http://www.cnblogs.com/cyq1162/archive/2011/03/08/1977422.html

【编辑推荐】

  1. Mongodb亿级数据量的性能测试
  2. MongoDB和MySQL性能测试及其结果分析
  3. 精炼概括Oracle性能测试
  4. MySQL性能测试大总结
  5. MySQL中MyISAM引擎和Heap引擎执行速度性能测试
责任编辑:艾婧 来源: 博客园
相关推荐

2009-09-18 13:05:59

.NET CLR

2009-12-03 19:02:05

Linux

2010-11-08 14:26:16

云计算标准

2010-09-25 14:45:47

LinuxJVM

2010-12-20 09:37:55

Opera 11Chrome 10

2010-09-27 14:37:10

评测SSL VPN

2009-02-01 09:29:44

2013-02-22 09:49:29

Nagios监控性能评测

2010-01-05 13:56:37

2009-05-25 08:52:47

GoogleChrome浏览器

2017-03-07 07:44:52

Spark数据倾斜

2013-07-16 09:09:30

Ubuntu

2015-12-30 19:19:37

云存储

2011-12-13 09:12:34

JavaNIO

2011-09-13 14:30:43

笔记本评测

2013-05-17 11:41:48

华为高性能存储卡

2009-06-08 09:57:45

编程语言编程语言性能高级编程语言

2017-08-07 10:04:49

数据数据治理数据管理

2022-05-13 23:03:25

大数据Big Data巨量资料

2010-05-11 14:24:38

Chrome浏览器性能横评测
点赞
收藏

51CTO技术栈公众号