2009-11-04 11 views
12

Al utilizar .NET 3.5 SP1 en la aplicación ASP.NET MVC, ObjectContext puede tener un tiempo de vida en una Http Request OR de un método SINGLE.Coste de rendimiento de la creación de ObjectContext en cada método en Entity Framework v1

using (MyEntities context = new MyEntities()) 
{ 
//DO query etc 
} 

¿Cuánto se incrementa costo de rendimiento de crear ObjectContext en cada método VS por la petición?

Gracias.

+0

Buena pregunta. Algunas personas mencionan la generación de vistas para aumentar el rendimiento mientras se crea el contexto, pero no tengo idea si el rendimiento se acelera durante la primera ejecución de la aplicación o durante cada creación de ObjectContext. – kubal5003

Respuesta

1

¿El modelo subyacente es pequeño o grande, simple o complejo? El costo de inicialización y uso de un nuevo objetocontext crece con el tamaño y la complejidad del modelo. Si tiene un puñado de entidades, por lo general es negligetable. Si tienes cientos de entidades, entonces puede ser significativo.

Ver:
http://oakleafblog.blogspot.com/2008/08/entity-framework-instantiation-times.html
y
http://blogs.msdn.com/adonet/archive/2008/06/20/how-to-use-a-t4-template-for-view-generation.aspx

16

El costo de crear el contexto es muy baja. Sin embargo, usar un nuevo contexto significa que no tiene consultas en caché de contextos anteriores. Puede solucionar esto hasta cierto punto con la generación de vistas o CompiledQuery. Véase también Performance Considerations for Entity Framework Applications

Por otro lado, mantener un contexto durante mucho tiempo significa que está rastreando cantidades crecientes de información de estado, que tiene un costo de rendimiento propio.

En mi opinión, sin embargo, el costo más significativo de un contexto es la complicación del código. Usar contextos múltiples tiende a generar un código confuso. Así que trato de usar un contexto por grupo de operaciones relacionadas, p. manejando una única solicitud HTTP.

+0

"El caché del plan de consulta se comparte entre las instancias de ObjectContext dentro del mismo dominio de aplicación. No es necesario retener una instancia de ObjectContext para beneficiarse del almacenamiento en caché del plan de consulta." [https://msdn.microsoft.com/en-us/library/hh949853(v=vs.113).aspx#3%20Caching%20in%20the%20Entity%20Framework] –

+0

Sí, las consideraciones han cambiado desde que escribí esta respuesta hace 8.5 años. –

1

Estoy usando EF6 y el esquema de 163 entidades que se generan primero desde Oracle.

Estoy midiendo los tiempos de inicialización y el tiempo para obtener 100 registros de la tabla indexada.

C# Prueba

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; 
} 

Resultados:

    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 | 
+------------------+-------+----------+-----------------+-------+----------+ 
Cuestiones relacionadas