今天装好了VS2008 Beta2,就迫不及待地试用一下Linq中的ORM功能,在初步尝试后,发现Linq中的ORM还是非常不错的,通过反射查看System.Data.Linq.dll发现,Linq中的ORM是使用反射完成了OR的映射工作,基于此,我开始有点怀疑Linq中的ORM的性能问题。为了进一步研究问题,我写了一个简单的测试,在事务中,使用DataRabbit 3.0和 Linq to sql 以ORM的方式分别向数据库的Customer表中插入1000条数据,来看各自所需的时间。
首先,Customer结构如下:
测试的代码如下:
(1)使用Linq ORM:
DataClasses1DataContextdb=newDataClasses1DataContext("DataSource=127.0.0.1;InitialCatalog=LinqDb;PersistSecurityInfo=True;UserID=sa;Password=chenqi");
DateTimestart=DateTime.Now;
for(inti=1000;i<2000;i++)
{
db.Customers.Add(newCustomer{ID=i,Name="Peng",ZipCode=434100});
}
db.SubmitChanges();
DateTimeend=DateTime.Now;
TimeSpanspan=end-start;
this.label1.Text=span.TotalSeconds.ToString();
(2)使用DataRabbit3.0的ORM
DataRabbit.DataConfigurationconfig=newDataRabbit.DataConfiguration(DataRabbit.DataBaseType.SqlServer,"127.0.0.1","sa","chenqi","LinqDb",null);
DataRabbit.Application.TransactionScopeFactorytransactionScopeFactory=newDataRabbit.Application.TransactionScopeFactory(config);
transactionScopeFactory.NewTransactionScope(false).NewOrmAccesser<LinqTest.MyOrm.Customer>().Insert(newLinqTest.MyOrm.Customer(-1,"Peng",434100));
DateTimestart=DateTime.Now;
using(DataRabbit.Application.TransactionScopescope=transactionScopeFactory.NewTransactionScope())
{
DataRabbit.ORM.IOrmAccesser<LinqTest.MyOrm.Customer>accesser=scope.NewOrmAccesser<LinqTest.MyOrm.Customer>();
for(inti=2000;i<3000;i++)
{
accesser.Insert(newLinqTest.MyOrm.Customer(i,"Peng",434100));
}
scope.Commit();
}
DateTimeend=DateTime.Now;
TimeSpanspan=end-start;
this.label2.Text=span.TotalSeconds.ToString();
清空Customer的内容,第一次点击Form的按钮(先linq,后DataRabbit)后,界面显示如下:
再次清空Customer的内容,第二次点击Form的按钮(先linq,后DataRabbit)后,界面显示如下:
和结果一相比,我们发现linq ORM在运行时作了一些非常有效的优化,性能提升了将近一倍。如果再重复试验,会发现Linq和DataRabbit所需的时间基本上不再变化。
从稳定的结果看来,DataRabbit3.0的ORM性能比Linq要高出将近一倍,出现这样的结果,也是我意料之中的吧。DataRabbit3.0采用Emit动态生成程序集可以完全避免反射所带来的性能损失,而Linq to sql的内部采用反射实现ORM而导致性能稍微下降则是情理之中的了。
Linq使用反射实现ORM的一个地方如下所示:
(System.Data.Linq.ChangeDirector+StandardChangeDirector的Insert方法实现)
也许,也许还有更高效使用Linq ORM的方法而我没有发现,如果你知道,请一定留言告诉我。
测试的源码从此处下载。
分享到:
相关推荐
LINQ to SQL语句(19)之ADO.NET与LINQ to SQL LINQ to SQL语句(20)之存储过程 LINQ to SQL语句(21)之用户定义函数 LINQ to SQL语句(22)之DataContext LINQ to SQL语句(23)之动态查询 LINQ to SQL语句(24)之视图 LINQ ...
LINQ To SQL实现分页效果源码 VS2008 Frameworks3.5 LINQ To SQL 实现分页效果 数据库SQL 2005
LINQ TO SQL[1] 是包含在.NET Framework 3.5 版中的一种 O/RM 组件(对象关系映射),O/RM 允许你使用 .NET 的类来对关系数据库进行建模。然后,你可以使用LINQ对数据库中的数据进行查询、更新、添加、删除。 LINQ TO ...
An example of Linq to Sql by C#.
一个简单的linq to sql c#例子 实现数据库操作基本功能
linq基础 linq to sql linq基础 linq to sql
Use linq for sql connection
实现linq多个查询条件连接功能(支持linq to sql 和linq to entity)。 按多个指定属性排序功能。 不同参数的lamdba表达式条件间的转换功能。
ASP.NET MVC+LINQ TO SQL登陆
linq to sql实现分层与gridview使用实现增删改,适合新手做三层项目开发,快速入门
自己学linq to sql时做的demo
一步一步学 Linq to sql 一步一步学 Linq to sql.doc 一步一步学 Linq to sql.doc
LINQ to SQL和Entity Framework对比与关联LINQ to SQL和Entity Framework对比与关联
LINQ to SQL 学习资料 保存的网页
LINQ to SQL可视化调试工具,下载文件包括一个可视化调试工具的.dll程序集(在bin\debug文件夹下),而且还包含了源代码!算是小小的补偿吧:)
Linq to Sql 教程大全
C#_3.0_LinQ入门系列
LINQ to SQL语句(19)之ADO.NET与LINQ to SQL 60 1.连接 61 2.事务 61 LINQ to SQL语句(20)之存储过程 63 1.标量返回 63 2.单一结 果集 64 3.多个可 能形状的单一结果集 65 4.多个结果集 70 5.带输出参数 79 LINQ to ...
linq to sql 标准实例,有兴趣的可以学习下
完整的linq to sql 学习笔记。