Эксплуатационные затраты на создание ObjectContext в каждом методе в Entity Framework v1
При использовании .NET 3.5 SP1 в приложении ASP.NET MVC объект ObjectContext может иметь время жизни в одном запросе Http ИЛИ метода SINGLE.
using (MyEntities context = new MyEntities ())
{
//DO query etc
}
Сколько стоит увеличение производительности для создания ObjectContext в каждом методе VS для запроса?
Спасибо.
Ответы
Ответ 1
Стоимость создания контекста очень низкая. Однако использование нового контекста означает, что у вас нет кэшированных запросов из предыдущих контекстов. Вы можете в некоторой степени обойти это с помощью создания представлений или CompiledQuery. См. Также Рекомендации по производительности для приложений Entity Framework
С другой стороны, сохранение контекста в течение длительного времени означает, что вы отслеживаете увеличение количества информации о состоянии, которая имеет собственную стоимость исполнения.
Однако, на мой взгляд, наиболее значительная стоимость контекста - это сложность кода. Использование нескольких контекстов ведет к запутыванию кода. Поэтому я пытаюсь использовать один контекст для каждой группы связанных операций, например. обработка одного HTTP-запроса.
Ответ 2
Является ли базовая модель маленькой или большой, простой или сложной? Стоимость инициализации и использования нового objectcontext растет с размером и сложностью модели. Если у вас есть несколько объектов, это обычно не учитывается. Если у вас есть сотни объектов, это может быть значительным.
См:
http://oakleafblog.blogspot.com/2008/08/entity-framework-instantiation-times.html
и
http://blogs.msdn.com/adonet/archive/2008/06/20/how-to-use-a-t4-template-for-view-generation.aspx
Ответ 3
Я использую EF6
и схему из 163 объектов, которые сначала генерируются db из oracle.
Я измеряю время и время инициализации, чтобы получить 100 записей из индексированной таблицы.
Тест С#
var times = new List<Tuple<DateTime, DateTime, DateTime>>();
var carTypes = new List<CAR_TYPE>();
var j = 1;
while (j <= 10000)
{
for (int i = 0; i < j; i++)
{
var startTime = DateTime.Now;
using (var db = new EcomEntities())
{
var contextInitializationTime = DateTime.Now;
carTypes = db.CAR_TYPE.Take(100).ToList();
var executionTime = DateTime.Now;
times.Add(new Tuple<DateTime, DateTime, DateTime>(startTime, contextInitializationTime, executionTime));
}
}
var averageInitTime = times.Average(o => o.Item2.Subtract(o.Item1).TotalMilliseconds);
var averageRunTime = times.Average(o => o.Item3.Subtract(o.Item1).TotalMilliseconds);
Debug.WriteLine("averageInitTime - " + j + " " + averageInitTime);
Debug.WriteLine("averageRunTime - " + j + " " + averageRunTime);
j = j*10;
}
Результаты:
Runs MS Runs MS
+------------------+-------+----------+-----------------+-------+----------+
| averageInitTime | 1 | 134.0134 | averageRunTime | 1 | 1719.172 |
+------------------+-------+----------+-----------------+-------+----------+
| averageInitTime | 10 | 12.27395 | averageRunTime | 10 | 160.3797 |
+------------------+-------+----------+-----------------+-------+----------+
| averageInitTime | 100 | 1.540695 | averageRunTime | 100 | 19.94794 |
+------------------+-------+----------+-----------------+-------+----------+
| averageInitTime | 1000 | 0.281756 | averageRunTime | 1000 | 6.121224 |
+------------------+-------+----------+-----------------+-------+----------+
| averageInitTime | 10000 | 0.167058 | averageRunTime | 10000 | 4.751353 |
+------------------+-------+----------+-----------------+-------+----------+