[转]How to Improve Entity Framework Add Performance?
本文转自:http://entityframework.net/improve-ef-add-performance
When you overuse the Add() method for multiple entities, your application suffers from performance issues.
using (var ctx = new CustomerContext())
{
foreach(var line in lines)
{
var customer = new Customer();
// ...code...
ctx.Customers.Add(customer);
}
ctx.SaveChanges();
}
StackOverflow Related Questions
Answer
Is Entity Framework Add Really Slow?
In fact, the Add method is not slow at all. Adding an entity to a list cannot be that slow. It's the DetectChanges method invoked inside the Add method which is insanely slow!
Using the Add method in a loop is usually a poor practice which impacts your application performance severely when poorly used.
- USE AddRange over Add (Recommended)
- SET AutoDetectChanges to false
- SPLIT SaveChanges in multiple batches
Use AddRange over Add (Recommended)
When adding multiple entities, you should always use Entity Framework AddRange once with a list instead of calling multiple time the Add method.
Why?
- The Add method DetectChanges after every records added.
- The AddRange method DetectChanges after all records are added.
Performance Comparisons
| Operations | 100 Entities | 1,000 Entities | 10,000 Entities |
|---|---|---|---|
| Add | 15 ms | 1,050 ms | 105,000 ms |
| AddRange | 1 ms | 10 ms | 120 ms |
Note:
- *: SaveChanges time not included
- **: Entity with two relations
How?
- CREATE a list
- ADD entity to the list
- USE AddRange with the list
- SaveChanges
- Done!
using (var context = new EntityContext())
{
// 1. CREATE a list
List<Customer> list = new List<Customer>();
for(int i = 0; i < 2000; i++)
{
var customer = new Customer();
// ...code...
// 2. ADD entity to the list
list.Add(customer);
}
// 3. USE AddRange with the list
context.Customers.AddRange(list);
// 4. SaveChanges
ctx.SaveChanges();
// 5. Done!
}
SET AutoDetectChanges to false
When adding multiple entities, if you cannot use AddRange, set Entity Framework AutoDetectChanges to false
Why?
- The Add method DetectChanges after every records added.
By disabling AutoDetectChanges, the DetectChanges method will only be invoked when you do it.
Performance Comparisons
| Operations | 100 Entities | 1,000 Entities | 10,000 Entities |
|---|---|---|---|
| True (Default) | 15 ms | 1,050 ms | 105,000 ms |
| False | 1 ms | 14 ms | 180 ms |
Note:
- *: SaveChanges time not included
- **: Entity with two relations
How?
- SET AutoDetectChangesEnabled = false
- CALL DetectChanges before SaveChanges
- SaveChanges
- Done!
using (var context = new EntityContext())
{
// 1. SET AutoDetectChangesEnabled = false
context.Configuration.AutoDetectChangesEnabled = false;
List<Customer> list = new List<Customer>();
for(int i = 0; i < 2000; i++)
{
var customer = new Customer();
// ...code...
list.Add(customer);
}
context.Customers.AddRange(list);
// 2. CALL DetectChanges before SaveChanges
context.ChangeTracker.DetectChanges();
// 3. SaveChanges
context.SaveChanges();
// 4. Done!
}
SPLIT SaveChanges into multiple batches
This solution is not recommended. When adding multiple entities, split entities with a batch size in multiple different contexts.
Why?
More tracking entities your context contains, slower the DetectChanges method is! So by reducing the number of entities by context, you improve the performance.
Performance Comparisons
| Operations | 100 Entities | 1,000 Entities | 10,000 Entities |
|---|---|---|---|
| Unlimited | 15 ms | 1,050 ms | 105,000 ms |
| 10 | 3 ms | 40 ms | 350 ms |
| 100 | 15 ms | 125 ms | 1,200 ms |
| 1,000 | 15 ms | 1,050 ms | 10,200 ms |
Note:
- *: SaveChanges time not included
- **: Entity with two relations
How
- CREATE a batchSize variable
- CALL SaveChanges before creating a new batch
- CALL SaveChanges
- Done!
// 1. CREATE a batchSize variable
int batchSize = 400;
var context = new EntityContext();
for(int i = 0; i <= 2000; i++)
{
// 2. CALL SaveChanges before creating a new batch
if (i != 0 && i%batchSize == 0)
{
context.SaveChanges();
context = new EntityContext();
}
var customer = new Customer();
// ...code...
context.Customers.Add(customer);
}
// 3. CALL SaveChanges
context.SaveChanges();
// 4. Done!
[转]How to Improve Entity Framework Add Performance?的更多相关文章
- [2014-09-18]Entity Framework 6 预热、启动优化
好久没写博客了,终于憋出了一个大招,现在总结下. 虽然文章题目是针对EF的,但涉及的内容不仅仅是EF. 场景介绍 目前在做的一个项目,行业门户,项目部分站点按域名划分如下: user.xxx.com: ...
- Access MongoDB Data with Entity Framework 6
This article shows how to access MongoDB data using an Entity Framework code-first approach. Entity ...
- Entity Framework 6 预热、启动优化
虽然文章题目是针对EF的,但涉及的内容不仅仅是EF. 场景介绍 目前在做的一个项目,行业门户,项目部分站点按域名划分如下: user.xxx.com:用户登陆注册 owner.xxx.com:个人用户 ...
- Performance Considerations for Entity Framework 4, 5, and 6
Performance Considerations for Entity Framework 4, 5, and 6 https://msdn.microsoft.com/en-sg/data/hh ...
- [XAF] How to improve the application's performance
[自己的解决方案]数据量大时,可显著提升用户使用体验! 1.Root ListView 参考官方的E1554 点击导航菜单后首先跳出查询条件设置窗体进行设置 可设置查询方案或查询方案的查询条件,排序字 ...
- Why you should use async tasks in .NET 4.5 and Entity Framework 6
Improve response times and handle more users with parallel processing Building a web application usi ...
- Entity Framework与ADO.NET批量插入数据性能测试
Entity Framework是.NET平台下的一种简单易用的ORM框架,它既便于Domain Model和持久层的OO设计,也提高了代码的可维护性.但在使用中发现,有几类业务场景是EF不太擅长的, ...
- Code First :使用Entity. Framework编程(8) ----转发 收藏
第8章 Code First将走向哪里? So far, this book has covered all of the Code First components that reached the ...
- Code First :使用Entity. Framework编程(7) ----转发 收藏
第7章 高级概念 The Code First modeling functionality that you have seen so far should be enough to get you ...
随机推荐
- 【慕课网实战】Spark Streaming实时流处理项目实战笔记十五之铭文升级版
铭文一级:[木有笔记] 铭文二级: 第12章 Spark Streaming项目实战 行为日志分析: 1.访问量的统计 2.网站黏性 3.推荐 Python实时产生数据 访问URL->IP信息- ...
- a标签使用href=”javascript:void(0); 在火狐浏览器跟chrome 不兼容
使用如下方式的链接.在Chrome中点击后行为符合预期,但在IE下会新开标签卡(根据参考资料,Firefox中有相同问题).<a href=”javascript:void(0);” targe ...
- 关于esp32的系统初始化启动过程及设计学习方法
对于esp32,其开发程序中有且只能有一个app_main函数,该函数是用户程序的入口,这在没有调用FreeRTOS的系统中相当于函数main,但其实在app_main之前,系统还有一段初始化的过程, ...
- Spring Cloud之踩坑01 -- Eureka高可用配置
转载:https://blog.csdn.net/dear_Alice_moon/article/details/79373955 问题描述: 在进行Eureka高可用配置时,控制台一直出现“.... ...
- Hadoop 系列文章(一) Hadoop 的安装,以及 Standalone Operation 的启动模式测试
以前都是玩 java,没搞过 hadoop,所以以此系列文章来记录下学习过程 安装的文件版本.操作系统说明 centos-6.5-x86_64 [bamboo@hadoop-senior opt]$ ...
- js-function作用域
你能猜出先弹出什么吗? <!DOCTYPE html> <html lang="en"><head> <meta charset=&quo ...
- 函数round和trunc
1.round函数. round函数能够按照数学规则进行四舍五入的进位,以保留小数点后要求的位数. 使用方法为 round(<小数>,<保留的位数>) 下面是两个例子: ) f ...
- [UWP]使用Picker构建应用内图片公共裁剪组件
在上一篇博文<[UWP]如何实现UWP平台最佳图片裁剪控件>中我讲解了编写ImageCropper控件的过程及知识分享.在那篇文章里,我大言不惭的称其为UWP平台最佳图片裁剪控件(主要是没 ...
- web API简介(四):客户端储存之IndexedDB API
概述 前篇:web API简介(三):客户端储存之Web Storage API 客户端储存从某一方面来说和动态网站差不多.动态网站是用服务端来储存数据,而客户端储存是用客户端来储存数据. Index ...
- nginx代理tomcat做负载
先对三台服务器统一环境. 对两台tomcat服务器的操作 查看jdk环境 # java -version openjdk version "1.8.0_65" OpenJDK Ru ...