zhuweisky

君子之行,静以修身,俭以养德。非淡泊无以明志,非宁静无以致远。
ESFramework,基于.NET的通信框架。DataRabbit,轻量的数据访问框架。DCFramework,基于.NET的动态分布式计算框架。sky.zhuwei@163.com

统计

留言簿

积分与排名

好友博客

阅读排行榜

评论排行榜

DataRabbit 轻量的数据访问框架(13)--DataRabbit 3.0 ORM性能大幅度提升!

   DataRabbit 3.0重写了DataRabbit 2.0的ORM实现的内核,性能提升了90倍左右,结果是DataRabbit 3.0的ORM性能与直接使用ADO.NET的性能已经非常接近。这是如何做到的?
   主要是基于两点:
(1)DataRabbit 2.0 基于泛型和反射实现,而DataRabbit 3.0 基于泛型和Emit动态程序集实现。
   DataRabbit 2.0使用反射机制将值在O和R之间传递,如此大量使用反射会使性能折损不少。DataRabbit 3.0在运行时,会根据Table的Schema动态发射(Emit)针对该表的数据访问器(Accesser)于内存中,并缓存它。DataRabbit 3.0将直接使用发射得到的数据访问器来实现值在O和R之间的传递,完全避免的反射。

(2)缓存Table Schema。
   2.0版本中,当IORMAccesser基于Transaction时,其所采用的ISchemaAccesser也是基于Transaction的,由于ISchemaAccesser基于Transaction,所以一个ISchemaAccesser对象在本次事务结束时也会释放,这使得已经获取的Table Schema无法缓存(虽然ISchemaAccesser自身有缓存Schema的功能)。于是,我修改IORMAccesser使其采用基于非事务的ISchemaAccesser,这样Table Schema就会被缓存下来以重复使用,避免了每次ORM Transaction 访问数据库时,都需要去重新获取Schema所带来的性能损失。

(3)其它细节优化。

   DataRabbit 2.0 与 DataRabbit 3.0关于ORM的性能对比。

(注:结算一局需要在同一Transaction中6次访问数据库,其中还包含了业务计算。)

   下面给出DataRabbit 3.0的下载。

   关于DataRabbit的更多介绍请见:DataRabbit 轻量的数据访问框架(00) -- 序

posted on 2007-07-28 10:14 zhuweisky 阅读(3719) 评论(17)  编辑 收藏 网摘 所属分类: DataRabbit

评论

#1楼 2007-07-28 10:19 补丁      

2.0的性能真够差的   回复  引用  查看    

#2楼 2007-07-28 12:06 金色海洋(jyk)      

恭喜。VB到了6.0才基本稳定,现在的.net 1.1 都应该算作7.0(或者7.5)了。2.0差没什么的,3.0不是提高了嘛,希望4.0更好用!
  回复  引用  查看    

#3楼 2007-07-28 14:07 魏琼东      

楼主,你的博客95%文章我都看过,东西写的不错。感觉你的很多创意是在开发过程中得到。

对于ORM,是否考虑不使用反谢及Emit?

我也搞过这样的东西,搞了一套中间件(IOC、ORM、Services ),应用服务器,

当然,有几家公司在用,我没有怎么介绍过,用反射,对于大应用系统(数据库10G左右,单表1000万之上,客户端(100-200),机器配置也不是太高的情况下,ORM的性能及内在占用,可不好解决呀。

呵呵,我主要搞Winform开发。
  回复  引用  查看    

#4楼 2007-07-28 14:28 oxsoft.cn[未注册用户]

来个DEMO,好像不太好用!个人认为   回复  引用    

#5楼 2007-07-28 22:52 大石头      

不用反射,也不用Emit,只是用代码生成器生成赋值语句岂不是更好?   回复  引用  查看    

#6楼 2007-07-28 23:18 henry[未注册用户]

@大石头
@魏琼东
硬编译JIT后和Emit JIT后有性能的差别吗?其实损耗只是多了个方法的接桥.
我真想看一下在1kW数据读取来有那个程序不慢的.
  回复  引用    

#7楼 2007-07-29 09:27 zdnet[未注册用户]

一般XX版本比XX版本性能提高90倍的东西只能说明上一个版本设计存在缺陷...可以直接导致用户对现在这个版本提出质疑...so...   回复  引用    

#8楼 2007-07-30 10:19 lexus      

菜鸟问什么是Emit?   回复  引用  查看    

#9楼 2007-08-03 08:31 大石头      

我很少用Emit。
理论上它们应该没有任何性能差别,只是刚开始的时候Emit编译要慢点
  回复  引用  查看    

#10楼 2007-08-07 11:30 博主[未注册用户]

3.0都没有DEMO..   回复  引用    

#11楼 2007-08-08 10:37 大剑师      

不错,理所应当的性能改进,怎么会质疑呢,除了棒槌   回复  引用  查看    

#12楼 2007-08-13 16:47 ccc110[未注册用户]

demo不可用,登录会有个异常,string转换到int32失败
而且,通过sql企业管理器自行插入的用户,及时密码填对了也提示密码错误
  回复  引用    

#13楼 2007-08-17 16:39 newbie[未注册用户]

试用了下,发现数据库类型为byte[]的时候程序会出错哦   回复  引用    

#14楼 2007-09-23 09:50 www.oxsoft.cn[未注册用户]

希望有人写个3。0的DEMO   回复  引用    

#15楼 2008-02-12 21:16 alpha7happy[未注册用户]

我用下面这段代码

DataBaseType ServerType = DataBaseType.SqlServer;

String DataSource = "testDB";
String ConIP = "localhost";
String UserID="sa";
String PassWord="sa";

try
{
DataConfiguration config = new DataConfiguration(ServerType, ConIP, UserID, PassWord, DataSource, DataSource);
return (IDataAccesser)DataAccesserFactory.CreateDataAccesser(config);
}
catch(Exception e)
{
Console.WriteLine(e.Message);
return null;
}
finally
{

}

当运行到return (IDataAccesser)DataAccesserFactory.CreateDataAccesser(config);
时发生异常System.BadImageFormatException。字段标记超出范围。
DLL中的调用堆栈是:
[BadImageFormatException: 字段标记超出范围。]
System.Collections.Generic.Dictionary`2.Initialize(Int32 capacity) +0
System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) +24
System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value) +11
DataRabbit.DataAccesserFactory.Initialize() +94
DataRabbit.DataAccesserFactory..cctor() +37

InnerException是
[TypeInitializationException: “DataRabbit.DataAccesserFactory”的类型初始值设定项引发异常。]

请问如何解决?万望答复!我使用的是.NET Framework 2.0 SP1.
  回复  引用    

#16楼 2008-06-09 11:49 xmlcss[未注册用户]

@大石头
@魏琼东

不反射不Emit,用代码生成器的话还是ORM么?
  回复  引用    

#17楼 2008-07-30 17:04 朱哥卧笼[未注册用户]

我研究了一下,果然很强大,太好用了!!谁要3.0 DEMO 我发给他   回复  引用    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 834387




相关文章:

相关链接: