写点什么

大模型问题继续折磨着 Entity Framework 和 NHibernate

2013 年 12 月 24 日

使用 EDMX 模型为 Entity Framework 生成类的时候,大小非常重要。默认情况下,模型中的实体越多,生成操作执行的越慢。下面是引自 David Obando 提供的 bug 报告中的一段内容。本文中提到的表格来自于 AdventureWorks 的示例数据库。

如果 EDMX 模型中仅有一个实体类型(SalesOrderHeader),那么具体化需要 840 毫秒(中间值,运行 10 次);但是当 EDMX 模型包含更多模型的时候,例如一个有 67 个实体类型和 92 个关联的模型,同样的测试会消耗 7246 毫秒(中间值,运行 10 次)。

该性能问题在 Entity Framework 6 中存在,同时也能够在 Entity Framework 5 中重现。

根据一个 Reddit 用户对 NinetiesGuy 的处理,你能使用 AsNoTracking 选项作为一种变通。但是这样做能够引发其他的问题。Frans Bouma 响应说“AsNoTracking 意味着实体对象不可以也不能够被用于变化追踪场景,所以实际上是一个只读对象”。

LLBL Gen Pro ORM 的开发者 Frans Bouma 在他的文章《各种.NET ORM/ 数据访问框架的性能》中进一步讨论了这个问题。在该文章中,他阐述了如果打开变化追踪选项,那么 Entity Framework 和 NHibernate 实例化实体所消耗的时间比其他的 ORM 或者手工编码的对象要高出一个数量级。

对于该测试,“每一个操作都包含了一个从数据库中获取 31465 个实体的查询,然后在单独的对象中实例化它们并将其存储到一个集合中。给出的平均时间是在每一个框架上执行 10 次操作的平均时间(忽略这里面最慢的和最快的操作)。

谈到 NHibernate 的结果,他写道

我提供了在 NHibernate 代码上执行测试时的一个配置文件的屏幕截图,目的是为了查看为什么它会这么慢。当包含一个没有关系的实体的时候,NHibernate 代码耗时停留在 1500ms 左右,Entity Framework 大约是 1100ms。缓慢来自于模型中更多的关系,这正是问题的关键:没有必要让它影响单一类型集合的获取,其他的关系并没有什么作用,ORM 清楚这些内容。

缓慢并不受集合大小的影响,影响速度的是模型大小:关系越多,获取速度越慢。你或许会觉得集合大小也会影响速度,但是你指的是那些愚蠢的 ORM,它们将越来越多的实体存储到一个集合中,这确实会变得越来越慢,因为为了避免集合中的实体重复在向该集合中添加一个实体之前首先会执行 list.Contains(toAdd) 方法,因而存储的实体越多,速度就越慢。但是这与我们所讲的内容并没有什么关联,在我说的场景里面模型中的关系越多,速度就越慢。这就是我选择这个实体和这个数据库的原因:如果一个 ORM 中包含草率的代码,那么它就不能处理正常大小的模型,正如它所展示的。

查看英文原文 Large Model Problems Continue to Plague Entity Framework, NHibernate

2013 年 12 月 24 日 08:561820
用户头像

发布了 321 篇内容, 共 102.3 次阅读, 收获喜欢 6 次。

关注

评论

发布
暂无评论
发现更多内容

当代一线城市年轻人工作生活实录(HR篇)

Philips

Java 敏捷开发 快速开发 .net core

对于一款软件而言,完备的功能固然重要,但交互体验也不该被忽视

Learun

Java 敏捷开发 快速开发 .net core

当代一线城市年轻人工作生活实录(HR篇)

Learun

Java 敏捷开发 快速开发 .net core

为什么越来越多的非计算机领域企业,在自主做软件时都选择使用快速开发工具?

Learun

Java 敏捷开发 快速开发 .net core

「分布式一致性协议」从2PC、3PC、Paxos到 ZAB

海星

Linux入门系列1--环境准备及Linux安装

黑马腾云

Linux centos 运维 操作系统

学过 C++ 的你,你不得不知的这 10 条细节

小林coding

c c++ 编程 编程之路

初识WebRTC

soolaugust

WebRTC

高并发,你真的了解吗?

华为云开发者社区

负载均衡 软件 高并发 操作系统 服务器集群

LeetCode题解:88. 合并两个有序数组,双指针+从后往前,JavaScript,详细注释

Lee Chen

LeetCode 前端进阶训练营

《漫威复联》PC版游戏即将登陆,英特尔为其独家 CPU 合作伙伴

飞天鱼2017

艺术与科技的碰撞!Tristan Easton携手英特尔为漫威粉丝带来十代酷睿《复联》收藏版

飞天鱼2017

PHPStrom安装Xdebug及使用

书旅

php Xdebug PHPStrom

Nginx配置80端口用于多个域名

石云升

nginx 域名配置 80端口共用

技术分享丨数据仓库的建模与ETL实践技巧

华为云开发者社区

数据仓库 数据分析 数据模型 GaussDB ETL算法

对于一款软件而言,完备的功能固然重要,但交互体验也不该被忽视

Philips

Java 敏捷开发 UI .net core 交互设计

白话讲解:消息队列到底解决了什么问题?

博文视点Broadview

读书笔记 分布式 RocketMQ 中间件 消息队列

十年磨一剑-BIGO全球音视频技术解决方案

InfoQ_3597a20b53cc

人工智能 大数据 技术

实战分享丨MySQL 与Django版本匹配相关经验

华为云开发者社区

MySQL 数据库 django 华为云

C++ 借来的资源,如何还的潇洒?

小林coding

c c++ 编程 编程习惯 内存管理

C++ 互斥锁和条件变量的性能比较

小林coding

c c++ 编程 并发编程

为什么越来越多的非计算机领域企业,在自主做软件时都选择使用快速开发工具?

Philips

Java 敏捷开发 快速开发 .net core

Kotlin这么火!如何快速从Java过渡到Kotlin

华章IT

Java kotlin 协程 安卓

不懂 ZooKeeper?没关系,这一篇给你讲的明明白白

海星

Java zookeeper 分布式

lgloo Software 的 Jira Cloud 转型之旅

Atlassian速递

项目管理 DevOps 敏捷开发 Jira Cloud

linux入门系列2--CentOs图形界面操作及目录结构

黑马腾云

Linux centos7 操作系统 系统运维

低/零代码平台的优点有哪些?

代码制造者

编程语言 低代码 零代码 信息化 编程开发

【得物技术】乘风破浪—优雅代码四部曲

得物技术

Java 代码规范

一、GraphQL,你准备好了么?

星期35

推荐一款可视化+NoteBook工具

数据社

大数据 可视化 Zeppelin notebook

当代一线城市年轻人生活工作实录(蓝领打工仔篇)

Philips

Java .net 敏捷开发 快速开发 MES系统

NLP领域的2020年大事记及2021展望

NLP领域的2020年大事记及2021展望

大模型问题继续折磨着Entity Framework和NHibernate-InfoQ