linq to sql、Entity Framework 和 NHibernate 的性能如何?

Posted

技术标签:

【中文标题】linq to sql、Entity Framework 和 NHibernate 的性能如何?【英文标题】:How about performance of linq to sql, Entity Framework and NHibernate? 【发布时间】:2010-06-13 06:43:25 【问题描述】:

我学习这个 ORM 是因为认为这对于大多数项目来说都是很好的技术。但大多数雇主要求获得 ADO.NET 和 SQL。

这个 ORM 不会用在高负载的系统中(比如流行的网站)?这个 ORM 将在哪些类型的项目中有用?高负载项目是否使用 ORM?

【问题讨论】:

查看此线程 - ***.com/questions/1377236/… 【参考方案1】:

如果您希望获得最佳性能,请不要使用 ORM。也就是说,并非应用程序的所有部分都需要尽可能好的性能,而良好的 ORM(定制或现成的)可显着提高开发速度。

我不是 ORMBattle 网站的忠实粉丝,但在 *** 上搜索包括该术语在内的问题将为您提供有关 .NET ORM 性能的更多信息:

http://www.google.com/search?q=site:***.com+ormbattle

例如:

Testing custom ORM solution performance overhead - how to?

ORM (esp. NHibernate) performance for complex queries

良好的 ORM 导致的开销非常小(在 ADO.NET 之上),并且在大多数情况下性能会很好。

当您需要额外的性能时,一个好的 ORM 可以让您轻松“陷入困境”(即更接近原始 SQL 性能)。

【讨论】:

【参考方案2】:

ORM 肯定会成为性能杀手。我已经针对 ADO.NET(数据集和数据读取器)测量了 Entity Framework (v1) 和 LINQ to SQL 的性能。 EF 性能简直无法接受,尤其是在 Web 应用程序中会非常频繁地创建和丢弃数据上下文。 LINQ to SQL 还不错,但不符合高性能应用程序的要求。两者的区别在于 EF 是一个两层模型,没有生成代码来优化层之间的映射。 LINQ to SQL 是单层的,几乎没有提供太多的定制;折衷方案是 LINQ 查询更紧密地映射到关系模型,因此开销要少得多。

ORM 的概念当然很有价值;它会在应用程序级别产生更清晰的代码。但是没有免费的午餐。我目前正在编写一个自定义 ORM,它将单个数据模型映射到 SQL Server 和 Oracle,并且能够通过简单的应用程序配置设置在服务器之间切换。但是,没有 LINQ IQueryable 提供程序,所有查询都作为动态 SQL 编写或生成,并作为 ADO.NET 查询运行。所有数据库交互都作为特定操作的方法调用与应用程序接口,实体类的 IEnumerables 作为结果返回。性能在直接 ADO.NET 编码的 10% 范围内,但该性能水平是项目开始时的要求。

虽然此 ORM 的核心组件可用于任何项目,但获得 ORM 和高性能的唯一方法是避免任何动态映射,无论是层之间(如 EF 所做的那样)或将 LINQ 转换为 SQL . (写这个很痛苦,因为我非常喜欢 LINQ,但是映射成本太高了。我确实确保 LINQ to Objects 在 ORM 和应用程序使用中都可以使用结果。)

【讨论】:

【参考方案3】:

一切都取决于您的要求和架构。

当你有一个报告系统并且非常适合简单逻辑时,ORM 是邪恶的。如果将实施一个存储库模式可能会取得良好的性能。

但是,正如我所说,这一切都取决于您的要求和架构。

看看 CQRS(Command-Query Responsibility Segregation)here,这是一种有趣的系统设计方法。

【讨论】:

【参考方案4】:

看看Foundations of Programming,这是我开始的地方。

我喜欢使用 ORM,其中我有一个带域模型的关系数据库(要持久化的对象)。我发现它可以节省开发时间并提供更简洁的代码。

关于你关于工作的帖子,我也注意到了这一点。但是我只能推测答案是他们仍然有很多 .Net 开发人员仍在学习这个(ORM),因为框架不在他们的生产系统中。

我注意到一些似乎在使用 ORMS 的咨询公司(如果您是这些公司之一并且您不使用 orm,请更正这一点,我基于您的技术博客)

IMeta(为 NHibernate 提供商业支持)英国 Engine Room Apps(他们提供课程并使用 Nhibernate 编写应用程序)英国 EMC2(他们在 codeplex 上做了 whocanhelpme)

HTH

骨头

【讨论】:

以上是关于linq to sql、Entity Framework 和 NHibernate 的性能如何?的主要内容,如果未能解决你的问题,请参考以下文章

linq to sql、Entity Framework 和 NHibernate 的性能如何?

LINQ TO SQL 和 ADO.NET ENTITY 有啥区别呢?

初识Linq to Entity

SQL 查询显示了良好的数据库值,但 LINQ to Entity 框架从无处获得空值

使用内置 Linq to SQL 驱动程序在 LinqPad 中运行 Entity Framework Core 查询的更简单方法?

如何删除 Linq to Entity 中的多条记录? [复制]