thought persistence

简单,再简单一点

博客园 首页 新随笔 联系 订阅 管理
  15 Posts :: 0 Stories :: 142 Comments :: 1 Trackbacks

ADO.NET、NBear和NHibernate和IbatisNet简单读写性能比较
再续NBear性能测试:ADO.NET, NBearV3, NHibernateV1, NBearLite, NBearLite+NBearMapping性能比较

我总觉得这个例子里对数据库的操作不能反应实际运用情况

希望大家能写成这样的测试

load all categories, and traverse it's products
for(...)
{
 category cat = new category(id)
 load(cat)

 double sum = 0
 foreaach(product p in cat.products)
 {
  sum += p.amount  
 }
 // find entity in cat's products by id and by index
 cat.products[id].productname = cat.products[5].productname

}

写测试
// created
category cat = new category(id)
cat.xxx = xxx
....

for (....) // add some products
{
 cat.products.add(new product(id))
}

save(cat)

// update
cat = new catetory(id)
load(cat)

cat.xxx = xxx

foreach(product p in cat.products)
{
 p.xxx = xxx
}

save(cat)

// delete cat and it's products
delete(cat)

说明:
以实际情况做参考, category以100条数据为测试, 每个category下有30条product

不知大家用ORM的情况如何, 就我本人来说, 有这样几点是主要的:
根据class 生成数据库, 在项目初期可频繁更新迭代数据库的schema, 要做的只是修改domain class
类型化的entity和property便于在上述迭代中重构, 不至于隐藏的sql string中出现和schema不符的对象
关系的使用, cat.products["001"] cat.products.add(new product("002")) p.category.name role.users  user.roles
类型化的查询 product.category.name == "abc" & product.price > 100f

附上现有测试我的结果:
Read Performance Comparison(ms)
Repeat Times:2  ADO.NET:46    NHibernate:668  TBP:205  NBear:1246
Repeat Times:4  ADO.NET:94    NHibernate:215  TBP:132  NBear:1631
Repeat Times:10  ADO.NET:207    NHibernate:462  TBP:318  NBear:4083
Repeat Times:20  ADO.NET:413    NHibernate:852  TBP:641  NBear:8155
Repeat Times:30  ADO.NET:622    NHibernate:1260  TBP:951  NBear:12245
Write Performance Comparison(ms)
Repeat Times:40  ADO.NET:204     NHibernate:292     TBP:272  NBear:556
Repeat Times:80  ADO.NET:417     NHibernate:608     TBP:504  NBear:1016
Repeat Times:200  ADO.NET:1102     NHibernate:1533     TBP:1565  NBear:2731
Repeat Times:400  ADO.NET:2617     NHibernate:3861     TBP:2796  NBear:5516
Repeat Times:600  ADO.NET:4011     NHibernate:5079     TBP:4148  NBear:9527

实际上在读这个测试很不公平, 我的TBP太占便宜了, 为什么这样说呢
                EntityList<Products> products = s.GetList<Products>();
                EntityList<Categories> categories = s.GetList<Categories>();
                EntityList<Customers> customers = s.GetList<Customers>();
我的EntityList是在需要时才构造entity的, 如果要这样来一下:
                foreach (Products p in products)
                {
                    p.productName = p.productName;
                }
那么TBP的速度马上就和NBear相当了, 在这不得不PF NH的构造实体集合的速度

而在写测试上, 为什么TBP和Ado.net如此接近,? 实际上是Ado.Net的测试写得有问题
SqlHelper.ExecuteNonQuery(conn, CommandType.Text, "update Products set UnitPrice = 16.8 where ProductID = " + productID.ToString() );
对于多次循环执行的这样一句SQL, 没有使用DBCommand.PrepaidCommand和Parameter导致它的性能极大的降低了



posted on 2007-07-26 09:49 progame 阅读(2356) 评论(19)  编辑 收藏

Feedback

#1楼  2007-07-26 10:07 jjx      
这个主要看返回lis类型和entity的类型(包括某些属性,像关系端)
如list类型是如果是内置的ArrayList或是List<Tentity> , entity 类型没有变化(nhibernate有时会用dynamic proxy和emit生成),那么测试就足可以参考

据我的观察,linq to sql 现在的tolist是可以说明这点的
  回复  引用  查看    

#2楼  2007-07-26 10:07 随风流月      
比较乱。
不过为什么都没有 DLinq 测试?抗议中。。。
  回复  引用  查看    

#3楼 [楼主] 2007-07-26 10:12 progame      
DLinq一出 无人争锋 不过现在没办法用啊 时间不等人 总不能项目和产品等到Dlinq正式推出后才进行吧

如果只是需要List进行databind 那么就没必要使用entitylist了, 我的做法是这样的

grid.datasource = products.table;

需要entitylist的主要是为了集合操作, 如find add insert indexat remove save...
  回复  引用  查看    

#4楼  2007-07-26 10:28 kiler      
DLinq还是算了,等出了正式版再研究吧,微软的东西没出正式版之前最好不要花时间研究,前面的ajax.net和objectspace就是最好的例子。
  回复  引用  查看    

#5楼  2007-07-26 10:33 jjx      
linq to sql api应该不会大动了,我已经在june ctp上工作了近二周了,现在基本满意, 不过现在只能使用emacs+msbuild
  回复  引用  查看    

#6楼  2007-07-26 12:00 随风流月      
@jjx
命名空间还是会变化的...
Beta 1 --> June CTP 就是一个例证。
Beta 2 之后应该会稳定下来。
  回复  引用  查看    

#7楼  2007-07-26 12:24 henry      
其实这测的测试方式和直接条件读表是没有多大差别的.
对于是否要遍历读取来的数据跟组件没有多大关系,因为这些已经不属于数据库操作(不是组件的事情,用延时载加载处理例外).
等会给我的组件结果你看,希望看了以后不要觉得意外:)
  回复  引用  查看    

#8楼  2007-07-26 13:18 Jeffrey Zhao      
其实很多Reflection都是可以用Emit或CodeDom来避免的。
  回复  引用  查看    

#9楼  2007-07-26 13:30 henry      
加入HFSoft.Data的测试结果出来了,由于组件存在bug没有参与写操作.
http://www.cnblogs.com/henryfan/archive/2007/07/26/832160.html
  回复  引用  查看    

#10楼  2007-07-26 13:30 jjx      
@随风流月
beta1 和june ctp变化是很大
但june ctp 和beta1的变化很小,最主要的是DataShape被取消,而用DataLoadOptions类代替

其它像GetChangeText之类的,对项目基本没有影响
  回复  引用  查看    

#11楼  2007-07-26 13:49 镜涛      
ding!
  回复  引用  查看    

#12楼  2007-07-26 14:42 yi      
这样的测试结果并不具有代表性,因为软件是运行在复杂的环境中,而这种测试太过于单纯了
  回复  引用  查看    

#13楼  2007-07-26 14:56 江南白衣      
@kiler
Dlinq已经是板上钉钉的了,还会有什么悬念?
  回复  引用  查看    

#14楼  2007-07-26 15:00 江南白衣      
@jjx
beta1 和june ctp变化是很大
但beta2 和beta1的变化很小???
此话怎讲?beta和ctp之间的联系是什么?
我觉得变化应该是这样的:beta2 > june ctp > beta1

是这样嘛?

  回复  引用  查看    

#15楼  2007-07-26 15:18 jjx      
@江南白衣
抱歉,是笔误
意思是从june ctp 到beta 2对代码表面影响比较小

  回复  引用  查看    

DLINQ只支持MSSQL,
呵呵,可能以后出正式版我也很难用到吧
把NH进行到底....
  回复  引用    

已修复NBearV3中的性能问题:http://www.cnblogs.com/teddyma/archive/2007/07/26/831646.html,请使用NBearV3的朋友下载最新的NBearV3.7.2.6版。
  回复  引用  查看    

#18楼  2007-07-27 07:47 jjx      
nhibernate 的性能长进得确不小,在一个月前跑测试还是令人失望的,想不到现在马上可以接受了,nhibernate.test.performance.dll就是自带的性能测试
选取其中的performancetest

Objects: 2 Direct ADO.NET: 3124980
Objects: 4 Direct ADO.NET: 468747
Objects: 8 Direct ADO.NET: 937494
Objects: 16 Direct ADO.NET: 781245
Objects: 32 Direct ADO.NET: 1562490
Objects: 64 Direct ADO.NET: 3124980
Objects: 128 Direct ADO.NET: 9374940
Objects: 256 Direct ADO.NET: 26406081
Objects: 512 Direct ADO.NET: 42343479
Objects: 1024 Direct ADO.NET: 93905649
Objects: 2048 Direct ADO.NET: 233279757
NHibernate: 44843463ms / Direct ADO.NET: 31874796ms = Ratio: 1.406863Objects: 2 - NHibernate: 156249
Objects: 4 - NHibernate: 312498
Objects: 8 - NHibernate: 468747
Objects: 16 - NHibernate: 1093743
Objects: 32 - NHibernate: 1718739
Objects: 64 - NHibernate: 3437478
Objects: 128 - NHibernate: 8281197
Objects: 256 - NHibernate: 14843655
Objects: 512 - NHibernate: 33749784
Objects: 1024 - NHibernate: 82499472
Objects: 2048 - NHibernate: 224373564
Objects 2 NHibernate: 156249ms / Direct ADO.NET: 468747ms = Ratio: 0.3333333
Objects 4 NHibernate: 468747ms / Direct ADO.NET: 468747ms = Ratio: 1
Objects 8 NHibernate: 937494ms / Direct ADO.NET: 781245ms = Ratio: 1.2
Objects 16 NHibernate: 781245ms / Direct ADO.NET: 781245ms = Ratio: 1
Objects 32 NHibernate: 1562490ms / Direct ADO.NET: 1406241ms = Ratio: 1.111111
Objects 64 NHibernate: 3281229ms / Direct ADO.NET: 2812482ms = Ratio: 1.166667
Objects 128 NHibernate: 7968699ms / Direct ADO.NET: 5937462ms = Ratio: 1.342105
Objects 256 NHibernate: 14687406ms / Direct ADO.NET: 12656169ms = Ratio: 1.160494
Objects 512 NHibernate: 33593535ms / Direct ADO.NET: 29999808ms = Ratio: 1.119792
Objects 1024 NHibernate: 96718131ms / Direct ADO.NET: 124686702ms = Ratio: 0.7756892
Objects 2048 NHibernate: 247654665ms / Direct ADO.NET: 219373596ms = Ratio: 1.128917

  回复  引用  查看    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-07-26 10:04 编辑过


相关链接: