挖掘ADO.NET Entity框架的性能
|
源代码网整理以下ADO.NET团队最近讨论了ADO.NET Entity框架的各种性能特征。ADO.NET Entity框架在12月已经进入它的第三个beta版本,自那时起开发团队就开始为开发人员提供了使用该框架的相关信息。而现在,则为开发人员提供了框架性能方面的信息。 源代码网整理以下需要重点指出的是,当一个抽象层或者类似EDM(译注:指Entity Data Model)的模块被用来转换数据库的关系样式时,会带来一定的性能损失。 源代码网整理以下查询与结果 源代码网整理以下本文使用了NorthWind数据库作为模型,并创建了一个简单查询: 源代码网整理以下(NorthwindEntities ne = NorthwindEntities()) { (Order o ne.Orders) { i = o.OrderID; } } 源代码网整理以下每次操作的百分比值可以给我们一些启示: 源代码网整理以下装载元数据(11%) 源代码网整理以下耗时百分比值最大的是视图生成,它达到了惊人的56%。既然视图生成是造成性能损耗的罪魁祸首,那么开发人员最好是使用命令行工具EDM生成器(EdmGen.exe),运行时需要加上视图生成命令参数(/mode:ViewGeneration),它的输出内容为一个代码文件(C#或者VB.NET),可以包含在项目中。视图的预生成可以将启动时间降低到2933毫秒,而对于循环遍历操作,整个时间可以降低28%。生成视图并随着应用程序一起发布是提高性能的妙方,但其缺点则在于视图不再是动态的,一旦模型发生改变,就需要重新生成以保持同步。 源代码网整理以下查询性能 源代码网整理以下需要指出的是关于性能的主要设计要素是查询缓存。一旦执行了查询,它的一部分内容就被维持在全局缓存中。由于查询与元数据缓存的存在,使得第二次运行的执行速度总是比第一次运行快。例如,如下的Entity SQL查询: 源代码网整理以下(PerformanceArticleContext ne = PerformanceArticleContext()) { ObjectQuery<Orders> orders = ne.CreateQuery<Orders>(); (Orders o orders) { i = o.OrderID; } } 源代码网整理以下LINQ查询在执行方式上与Entity SQL查询相似。例如,下面的查询: 源代码网整理以下(PerformanceArticleContext ne = PerformanceArticleContext()) { var orders = from order ne.Orders select order; (Orders o orders) { i = o.OrderID; } } 源代码网整理以下Func<PerformanceArticleContext, IQueryable<Orders>> compiledQuery = CompiledQuery.Compile((PerformanceArticleContext ne) => (from o ne.Orders select o)); (PerformanceArticleContext ne = PerformanceArticleContext()) { (Orders o compiledQuery(ne)) { i = o.OrderID; } } 源代码网整理以下 源代码网供稿. |
