2009-11-04 3 views
12

Bei Verwendung von .NET 3.5 SP1 in ASP.NET MVC-Anwendung kann der ObjectContext Lebensdauer auf einer HTTP-Anforderung ODER einer SINGLE-Methode haben.Leistungsaufwand beim Erstellen von ObjectContext in jeder Methode in Entity Framework v1

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

Wie viel erhöht Leistungskosten Object VS pro Anfrage in jeder Methode zum Erstellen?

Danke.

+0

Gute Frage. Einige Leute erwähnen das Generieren von Ansichten, um die Leistung beim Erstellen von Kontexten zu erhöhen, aber ich habe keine Ahnung, ob der Leistungseinbruch während der ersten Ausführung der Anwendung oder bei jeder einzelnen Erstellung von ObjectContext auftritt. – kubal5003

Antwort

1

Ist das zugrunde liegende Modell klein oder groß, einfach oder komplex? Die Kosten für die Initialisierung und Verwendung eines neuen Objektkontexts steigen mit der Größe und Komplexität des Modells. Wenn Sie eine Handvoll von Entitäten haben, ist es normalerweise vernachlässigbar. Wenn Sie Hunderte von Entitäten haben, kann dies erheblich sein.

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

16

Die Kosten den Kontext der Schaffung sehr gering ist. Wenn Sie jedoch einen neuen Kontext verwenden, haben Sie keine zwischengespeicherten Abfragen aus früheren Kontexten. Sie können dies bis zu einem gewissen Grad mit der Generierung von Ansichten oder CompiledQuery umgehen. Siehe auch Performance Considerations for Entity Framework Applications

Auf der anderen Seite bedeutet das Behalten eines Kontexts für eine lange Zeit, dass Sie zunehmende Mengen von Zustandsinformationen verfolgen, die eigene Leistungskosten haben.

Meiner Meinung nach jedoch ist die Code-Komplikation die wichtigsten Kosten eines Kontexts. Die Verwendung mehrerer Kontexte führt oft zu verwirrendem Code. Also versuche ich, einen Kontext pro Gruppe verwandter Operationen zu verwenden, z. eine einzelne HTTP-Anfrage bearbeiten.

+0

"Der Abfrageplancache wird über ObjectContext-Instanzen innerhalb derselben AppDomain gemeinsam genutzt. Sie müssen keine ObjectContext-Instanz beibehalten, um vom Caching des Abfrageplans profitieren zu können." [https://msdn.microsoft.com/en-us/library/hh949853(v=vs.113).aspx#3%20Caching%20in%20the%20Entity%20Framework] –

+0

Ja, die Überlegungen haben sich geändert, seit ich geschrieben habe diese Antwort vor 8,5 Jahren. –

1

Ich verwende EF6 und Schema von 163 Entitäten, die db zuerst aus Oracle erzeugt werden.

Ich messe Initialisierungszeiten und -zeit, um 100 Datensätze aus der indizierten Tabelle zu erhalten.

C# Test

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

Ergebnisse:

    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 | 
+------------------+-------+----------+-----------------+-------+----------+ 
Verwandte Themen