通过升级.NET框架提升实体框架性能
2013-01-09 09:26 quanhb 阅读(1287) 评论(0) 编辑 收藏 举报实体框架(Entity Framework,简称EF)是微软的ORM框架,它的第一个版本(EFv1)包含在.NET Framework 3.5 Service Pack 1和Visual Studio 2008 Service Pack 1里面,于2008年8月11日发布。现在使用较为广泛的是它的第二个版本Entity Framework 4.0(EFv4),是随着.NET Framework 4.0和Visual Studio 2010于2011年4月12日发布。之后又发布了4.1、4.1 Update 1、4.3.1几个小版本。直到2012年8月2日,随着.NET Framework 4.5的正式发布,Entity Framework 5.0也一起发布了。截止到现在,Entity Framework已经推出了6.0,从6.0开始,Entity Framework开始作为一个独立的开源项目放在了CodePlex上。本文重点要讨论的是随着.NET Framework 4.5发布的Entity Framework 5.0这一版本的性能提升。
实体框架作为微软官方首推的ORM框架,结合Linq语句,它大幅提升了数据访问相关操作的开发效率。但和其他ORM框架一样,相比于原生SQL语句,性能也大打折扣,特别是对于涉及到多表操作的复杂Linq语句,他生成的SQL语句有时确实会复杂到超乎我们的想象。这也是它性能较低的主要原因之一,实体框架在将Linq语句转换成SQL语句时,需要对Linq语句进行编译,这其中会花费很大的CPU时间。实体框架提供的有一个CompiledQuery.Compile方法,可以用来显示的编译Linq语句,然后对其进行缓存。但一般开发人员不会去调用这个方法,毕竟这需要多写很多行代码才行。从EF5.0开始,实体框架会自动调用这个方法,并缓存编译结果。这一点改进大大提升了实体框架的性能:
这张图来自于微软ADO.NET团队的官方博客,其中给出了.NET4.0和.NET4.5在用各种方式执行相同逻辑的语句时的性能比较,其中最明显的是LINQ to Entities,从原来的23.14s提升到了4.12s其性能提升了将近600%,但比ADO.NET的1s还是要差些,这对我们已经很有诱惑力了。
虽然性能有了这么高的提升,但要用到我们现有的项目中要花费多大代价呢?从以往的经验来看,升级.NET框架可不是那么容易的事情,.NET4.5不是和Visual Studio 2012一起发布的吗?Visual Studio 2010我还没用熟呢,我的电脑能跑得动不?为了用2010才升级到8个GB的内存。那么多项目能编译通吗?要不要改代码呢?会不会不兼容呢?
庆幸的是,这些问题都不是问题,此次.NET框架的升级,采用的是所谓的in-place replacement的方式。什么意思呢?就是说安装4.5的框架会完全替换4.0的文件,装了4.5框架后,机器上就看不到4.0的框架了,但4.5还是用的4.0的运行时,所以我们原来4.0的程序还是可以照样运行。
对我们来说要做的就只有一件事,在本机和服务器上安装4.5的框架就可以了,当然还需要个中文语言包。下载地址如下:
4.5框架在线安装包:http://go.microsoft.com/fwlink/?LinkId=225704
4.5框架独立安装包:http://go.microsoft.com/fwlink/?LinkId=225702
4.5框架中文语言包:http://www.microsoft.com/zh-cn/download/details.aspx?id=30667
如果你有很多服务器需要安装,建议下载独立安装包和中文语言包来安装,如果你只想在本机试试,可以只下载在线安装包就可以了。
最后,还有件事情,对还在使用Windows XP或Windows Server2003的用户来说是个坏消息,4.5框架只支持以下操作系统:
Windows 7 Service Pack 1, Windows Server 2008 R2 SP1, Windows Server 2008 Service Pack 2, Windows Vista Service Pack 2。
当然,如果你很潮,使用的是Windows 8 或Windows Server 2012,那么4.5框架已经内置了,就不需要再安装了。
参考资料:
1、 http://en.wikipedia.org/wiki/ADO.NET_Entity_Framework
3、 http://www.west-wind.com/weblog/posts/2012/Mar/13/NET-45-is-an-inplace-replacement-for-NET-40