Teddy's Knowledge Base

ADO.NET、NBear和NHibernate简单读写性能比较


下载测试示例程序

说明:

本测试使用SqlServer2000的Northwind数据库的Categories、Customers和Products三个表,测试比较ADO.NET、NBear和NHibernate的读写性能。公平起见,测试代码并没有使用太多特别框架的独有功能或缓存,在实际测试前分别都进行了预读(保证元数据等都在第一次运行时已载入)。

读测试每次循环分别读取Categories、Customers和Products三个表的全部数据,三个组件分别返回DataSet,强类型实体数组和IList,虽然返回的数据类型不同,但是,实际上都包括了对返回数据的填充操作,因此,应该是相对公平的。结果显示NBear的性能近似于ADO.NET;NHibernate的独性能要差5倍左右。

写测试每次循环分别新建、更新并删除Categories、Customers和Products三个表中的各一条记录。ADO.NET由于是直接执行SQL的,速度最快是肯定的。NBear相比ADO.NET慢约3倍,NHibernate则大约慢2倍。

鉴于一般的系统读操作的频率远高于写操作,NBear的平均性能应该要比NHibernate好处不少。

测试并不完全,仅作参考。

Read Performance Comparison

Repeat Times ADO.NET (ms) NBear (ms) NHibernate (ms)
1 218 234 1140
2 484 515 3812
5 1109 1218 6078
10 2218 2484 12390

Write Performance Comparison

Repeat Times ADO.NET (ms) NBear (ms) NHibernate (ms)
20 125 312 234
40 203 656 437
100 546 1609 1046
200 984 3046 2015

posted on 2006-12-29 18:14 Teddy's Knowledge Base 阅读(5363) 评论(30)  编辑 收藏 所属分类: NBear

评论

#1楼  2006-12-29 18:17 Jeffrey Zhao      

我们在同一时间发了文,呵呵   回复  引用  查看    

#2楼  2006-12-29 18:20 Jeffrey Zhao      

对了,有朋友用了NBear的Url Rewrite,结合UpdatePanel时遇到了一点问题。虽然我觉得不是NBear的问题,但是我想它应该可以再改进一些,让Url Rewrite的功能更好。:)

下面是我写的问题的原因以及Workaround:
http://www.cnblogs.com/JeffreyZhao/archive/2006/12/27/UpdatePanel_with_Url_Rewrite.html   回复  引用  查看    

#3楼 [楼主] 2006-12-29 18:32 Teddy's Knowledge Base      

@Jeffrey Zhao
谢谢捧场~~

你的文章我看过了,分析得很透彻。

不过其实,NBear早期版本中的UrlRewrite模块在后来的版本中已经去除了。原因是,类似的UrlRewrite组件太多了,就不再维护一个完全重复的组件了。

对于UrlRewrite的这个问题,是不是可以写一个XXXExtender呢?那样无论用户使用什么基于HttpModule的UrlRewrite组件,都可以保证不出现这个问题。   回复  引用  查看    

#4楼  2006-12-29 19:28 让风吹--笨牛      

楼主,请教一下,在vs2003,c/s架构如何对一组件进行性能测试?   回复  引用  查看    

#5楼  2006-12-29 20:02 junmy      

@Jeffrey Zhao
@Teddy's Knowledge Base
@各位老大
@all

麻烦都把你们博客的 一些国外的 js链接等。。 都 停段时间吧
http://spa.snap.com/ 等。。
看你们的博客。。有这些链接的都慢的要死~


这次台湾地震的确挺强的 :)
  回复  引用  查看    

#6楼  2006-12-29 20:08 JesseZhao      

第一次亲身感受地震的危害啊,网速不知道什么时候才能修复   回复  引用  查看    

#7楼  2006-12-30 08:33 臭石头      

楼上的这个非常可恶,怎么到处发广告呀,我今早看了N篇文章,每篇最后都是他这广告   回复  引用  查看    

#8楼  2006-12-30 09:13 Cameo[匿名] [未注册用户]

分析的不错~   回复  引用    

#9楼  2006-12-30 09:28 iCaca      

不错不错...支持一下...
最近在比较NHibernate跟.NetTiers

iCaca dot Sun at Gmail dot com   回复  引用  查看    

#10楼  2006-12-30 16:05 哦哦 [未注册用户]

ADO.NET、怎么和这些框架扯蛋到一起去了晕....
最多比较哈这两个东西还差不多
NBear和NHibernate简单读写性能比较

不要误人子弟   回复  引用    

#11楼 [楼主] 2006-12-30 16:40 Teddy's Knowledge Base      

@哦哦
如果你了解ADO.NET返回DataSet的本质,就不该有这样的疑惑,如果你仔细阅读了文中的说明,也不该有这样的不负责任的留言。

我们知道无论是ADO.NET还是我们的ORM框架,读数据时,都是通过IDataReader读数据库的数据再进行填充,填充到DataSet或强类型实体或者IList都是是填充,本质上是类似的过程,所以,完全可以比较!   回复  引用  查看    

#12楼  2006-12-30 17:16 Wisdom-zh      

怎么不说基于 dotNet 的什么版本, dotNet 2.0 的 ADO 性能有点提升了
  回复  引用  查看    

#13楼 [楼主] 2006-12-30 17:38 Teddy's Knowledge Base      

@Wisdom-zh
这里的测试环境是.net2.0的,nbear只支持.net2.0。   回复  引用  查看    

#14楼  2006-12-30 22:19 flyzb [未注册用户]

我用过几个持久层框架,比较而言NBear的设计理念是比较先进的,方方面面都涉及到了,但却不够精细,许多地方使用起来让人感到有些简单。当然这可以理解,只有Teddy老兄一个人。我希望Teddy老兄能尽快解决以下几个问题,以便于能真正适应企业式开发,因为我也想最近能够采用NBear对我的项目进行重构。
1、能够进行配置,直接生成某个目录下的以各自的类名为命名的类文件,现在的形式查询和修改很不方便;
2、支持多命名空间,在生成类时只要把根namespaces改成自己的namespaces就可以了,后面的namespaces直接照搬;
3、类配置文件也按照类分开而独立成一个同名的文件,现在的形式查询和修改很不方便;
4、在把存储过程返回的结果转成对象时,能够自动按照类属性与字段名的对应关系做到无序的自动填充。因为在企业式开发中,为了保证性能,很多复杂的报表式查询只有存储过程才能保证。
5、从现在的使用观感来看,Entities.cs和EntityConfig.xml只是设计过程中的一种过度而已,重点都在EntityDesigns中的类图设计中,但是在元数据类属性的Attribute标记上不支持Intellisense功能,感觉不太方便。
从使用的类似性上看,NBear与Genome有许多共同之处,可以多多学习。同时希望以后NBear能支持LINQ。也许我要求有些高了,希望Teddy老兄能先实现前面几个功能,辛苦了,谢谢。   回复  引用    

#15楼 [楼主] 2006-12-30 23:03 Teddy's Knowledge Base      

@flyzb
谢谢你的建议,对这些方面我个人和NB团队会进一步讨论和寻求改进。
关于你说的这些方面,我稍作一些目前可以作的说明:

对于1:

之所以生成的实体在一个文件中,关系到一个设计出发点——就如生成的 Entities.cs文件开头的comment所说,该文件的代码是不应该手动修改的!既然,不应该手动修改,个人认为,就没必要每个类一个文件。

不过,尽管不应该手动修改,却一点也不影响这些实体的扩展性。扩展实体功能时,可以为需要扩展的每个实体在独立的.cs文件中写partial class。

这样的好处是,手动修改的代码都在手动维护的partial class的代码文件中,重新生成Entities.cs不会覆盖已有的手动扩展的代码,降低了维护成本。

对于2:

我考虑的另一个可能方案是增加一个用于实体设计的OutputNamespaceAttribute,可以表示在设计实体上,这样能完美解决生成的实体是多namespace的问题。当然,你说的方案也可以考虑,但是,未必所有人都应用这样的命名规范。

对于3:

和1类似,生成为一个文件的主要好处是为了开发时的维护便利,因为开发过程中,一般不应该修改EntityConfig.xml,而应该修改EntityDesign并重新生成对应的Entities和config,这个可以由vsplugin自动在后台完成。

对于4:

之所以默认将存储过程返回的数据填充到实体时使用索引而不是字段名成,也是为了“为了保证性能”。首先,按索引填充相比按字段名成要快一个数量级。而且,按索引的好处是可以只关心字段顺序,而不管字段名成,这在复杂查询时,也是有意义的,无需在写存储过程时还要仔细比对实体的属性名称,万一错了一个,还不抱错,很难调试错误的。

当然,可以考虑同时提供一个按字段名成填充实体的重载版本。

对于5:

Intellisense这个确实现在也无能为力,除非写Intellisense的IDE插件,这个成本似乎高了点。不过,实际上,目前使用VsIDE来设计EntityDesign只是,目前来说,最便利的一种方式。实际上,EntityDesign和EntityConfig可以等价转换。换句话说,理论上完全可以使用其他设计语言,设计工具来设计实体,只要他能生成正确格式的EntityConfig,比如,可以写一个自定义实体设计工具,也欢迎感兴趣的朋友来帮忙写这样的工具。

最后:

Genome没用过,有时间会学习一下。对于LINQ和DLINQ,在NBearV4中,一定会作完美继承,届时,相信就是一个全新层次的开发体验了。   回复  引用  查看    

#16楼  2007-01-05 18:17 mathboy [未注册用户]

向你虚心学习~~~   回复  引用    

#17楼  2007-01-05 18:18 mathboy [未注册用户]

这个留言板居然是局部刷新技术!!!
老大!!!   回复  引用    

#18楼  2007-01-07 00:24 九连环 [未注册用户]

不错,哪天和subsonic比较一下看看   回复  引用    

#19楼  2007-01-12 15:36 123[匿名] [未注册用户]

强   回复  引用    

#20楼  2007-01-18 10:23 345 [未注册用户]

正在找类似的技术框架。很不错,支持一下   回复  引用    

#21楼  2007-01-30 20:56 mathboy [未注册用户]

good   回复  引用    

#22楼  2007-01-30 20:56 boy [未注册用户]

Greate   回复  引用    

#23楼  2007-01-30 20:57 boy [未注册用户]

good!   回复  引用    

#24楼  2007-02-08 14:57 初学NBear [未注册用户]

使用SelectDataReader后不用关闭连接吗?   回复  引用    

#25楼 [楼主] 2007-02-08 15:03 Teddy's Knowledge Base      

只需要关闭reader,关联的connection就会自动关闭。   回复  引用  查看    

#26楼  2007-02-12 23:21 gangleader [未注册用户]

有没有用oracle的实际例子   回复  引用    

#27楼  2007-03-02 23:39 lqq [未注册用户]

一群牛人在交流啊,流口水   回复  引用    

#28楼  2007-04-23 14:50 fangyifeng [未注册用户]

我运行的比较nh要快。
Read Performance Comparison
Repeat Times ADO.NET (ms) NBear (ms) NHibernate (ms)
1 0 15 15
2 31 31 31
5 46 78 78
10 93 156 156

--------------------------------------------------------------------------------

Write Performance Comparison
Repeat Times ADO.NET (ms) NBear (ms) NHibernate (ms)
20 421 765 546
40 843 1640 1015
100 2203 3843 2500
200 4234 7859 5031


运行好多次了   回复  引用    

#29楼  2007-07-13 00:13 asdfas [未注册用户]

asdfg   回复  引用    

#30楼  2008-07-18 12:58 棠棠dotNet      

good
up
up
):   回复  引用  查看    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      


相关链接: