![]() | CYQ.Data 数据层框架CYQ.Data 是一款由路过秋天创作的支持多数据库应用[Txt,Xml,Access,MSSQL,Oracle,SQLite,MySql]的底层数据库操作类库,使用本类库可以轻松快速开发项目(QQ群:6033006)。 |
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等来的快些的。 因此,我也就简略的得出一个简单但不严谨的结论。 本次测试仅测试写数据,测试代码将在后面显示。 一:写个循环调用插入数据看看结果先 1:插入10条数据: 2:插入100条数据: 3:插入1000条数据: 分析从上面3张图的数据中,暂时得出的结论是: 结论疑问: 这个结论让人看着很迷惑,甚至是不太可能的,有几个疑点: 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倍不到的差距。
当然,这仅是一个小的测试,不能代表总体来做严谨的解答。 但,在某方面,也算是给对此框架性能有疑问的网友,作了一点解答。 至少,它还是值得你拥有的。 下载地址:http://www.cyqdata.cn/download/article-detail-426
最后给出测试的代码示例: 原始的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); } CYQ.Data 的MProc测试代码: public static void MProc() CYQ.Data 的MAction测试代码: public static void MAction() ![]() |
游客[注册][112.25.224.*]2012/6/16 22:28:02 | #5 | |
![]() | 性能测试,明显应该把DateTime start = DateTime.Now;放在con.Open();后面。 |
david_telvent2011/4/1 1:59:52 | #4 | |
![]() | 楼主,你好,能否来一遍关于CYQ.Data.DbBase.c和OrmBase.cs的讲解博文。翻遍了秋色园,都没有找到相关的文章。 |
allenliu2011/3/19 0:40:50 | #3 | |
![]() | 至于你说到的框架里面的事务,请问你是怎么来标识在action.Close()之前的多个数据操作对应一个事务,如果用户多了,同时生成了多个tran 你是怎么来确定这个对应关系的呢? 因为我有看你发的Q-blog的源码 所以看到一些这个框架的源码 才有了这点疑问。不知道你有没有理解我说的意思 呵呵 回复: 一个MAction实际就产生一个Command和Connection,而事务也是由此打开的,和普通的ADO.net没啥两样,在action.Close()时,仅是操作此链接的事务提交。 至于用户多了,同时生成多个tran,看了代码你应该会发现,事务只有在执行具体操作时才打开,所以为了减少并发造成的死锁,应该尽快些调用Close()事务。 至于多个tran各事务的对应关系应该是没啥联系的。 |
edidu2011/3/17 23:13:25 | #2 | |
![]() | 查询的性能呢?比如千级,万级,十万级,百万级,千万级的检索性能比较呢 回复: CYQ.Data 在查询功能上,MSSQL,Oracle中使用外置的分页存储过程,将性能的重点移交到外部,如果觉得分页性能有偏,可以优化分页存储过程,分布性能与框架本身影响不大。欢迎进行测试。 |
游客[注册][124.78.249.*]2011/3/9 10:22:58 | #1 | |
![]() | CYQ.Data 的性能基本维持和ADO.NET相差无几,在数据量上升到时1000时,也仅是2倍不到的差距。 由此说明,CYQ.Data 在性能上,是相当接近原始的ADO.NET,原因就在于,它并没有过多去封装ADO.NET。 ================= 2倍的速度,也敢说相差无几???!!! 其次,测试性能,10条100条的就别拿来说事了。 最后,测试还不公平。DateTime start = DateTime.Now;放的位置是不是应当放到紧挨着for前面? 回复: 时间放的位置我觉得很公平,从开始到结束。另速度上,你想啊,插入1000条就0.5秒0.8和1秒的差距,从数值上说最大是2倍,实际快不到1倍,这么表达,你能理解了没?你还能找到另一款好用,又性能比这个优越的框架? |
发表评论
论坛公告
帖子搜索
最新帖子
最新评论
- 请教博主。我mysql的提示 V5.7.7.4 MySql.xxxx:check the tablename "tbl_site_info" is exist? error:ExeDataReader():Expression #1 of ORDER BY clause is not in SELECT list, references column 'information_schema.s1.ORDINAL_POSITION' which is not in SELECT list; this is incompatible with DISTINCT 配置如下: <?xml version="1.0" encoding="utf-8" ?> <configuration> <connectionStrings> <add name="Conn" connectionString="host=192.168.3.101;Port=3306;Database=xxxxx;uid=root;pwd=2017" providerName="MySql.Data.MySqlClient"/> </connectionStrings> </configuration>
- 查询语句有点问题,软件启动时查询语句可以从数据库查询出数据,软件一直运行时无论怎么修改数据库,查询出来的还是老数据,不知道是为什么
- 我语句中用到了union all而且两个查询都有查询条件,action.select总是不成功,不知道有没有什么好的解决办法,谢谢
- 大神,如果我想通过一个对象(从数据映射过来的)要插入的话,我需要遍历字段然后每个set一下吗?有没有更好的方法??
- 真心好用,想问下秋天直接拼写sql怕注入吗
- V4.5后,好多方法都改变了,求来个新的日志帮助
- 請問大神V5源碼要多少錢 我是和交流過的
- 楼主,,从数据库里查出来并绑定datagridview,但是显示的都是数据库里的英文名,怎么改??好纠结啊这个。。。。
- 我想问一下,主从表添加怎样处理
- 10年就过了!!!!