2009-11-04 2 views
12

ASP.NET MVC 응용 프로그램에서 .NET 3.5 SP1을 사용하는 동안 ObjectContext는 하나의 Http Request 또는 SINGLE 메서드에서 수명을 가질 수 있습니다. 요청에 따라 VS 모든 방법 ObjectContext는 창조의Entity Framework v1의 모든 메서드에서 ObjectContext를 만들기위한 성능 비용

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

얼마나 증가 성능 비용?

감사합니다.

+0

좋은 질문입니다. 일부 사람들은 컨텍스트를 만드는 동안 성능을 향상시키기 위해 뷰를 생성한다고 언급하지만, 응용 프로그램이 처음 실행되는 동안 또는 ObjectContext를 한 번 만들 때마다 성능에 영향이 있는지 전혀 알 수 없습니다. – kubal5003

답변

1

기본 모델이 작거나 크거나 단순하거나 복잡합니까? 새 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

16

컨텍스트를 만드는 비용은 매우 낮습니다. 그러나 새 컨텍스트를 사용하면 이전 컨텍스트의 캐시 된 쿼리가 없다는 것을 의미합니다. 뷰 생성 또는 CompiledQuery를 사용하여이 문제를 어느 정도 해결할 수 있습니다. 또한 Performance Considerations for Entity Framework Applications

다른 한편으로 컨텍스트를 오랫동안 유지하면 오히려 증가하는 양의 상태 정보를 추적 할 수 있으며 이는 자체적으로 성능 비용이 많이 듭니다.

그러나 내 의견으로는 컨텍스트의 가장 중요한 비용은 코드 복잡성입니다. 다중 컨텍스트를 사용하면 혼동을 야기하는 경향이 있습니다. 따라서 관련 작업 그룹별로 하나의 컨텍스트를 사용하려고합니다. 단일 HTTP 요청을 처리합니다.

+0

"쿼리 계획 캐시는 동일한 AppDomain 내의 ObjectContext 인스턴스간에 공유되므로 쿼리 계획 캐싱의 이점을 얻기 위해 ObjectContext 인스턴스를 고정 할 필요가 없습니다." [https://msdn.microsoft.com/en-us/library/hh949853(v=vs.113).aspx#3%20Caching%20in%20the%20Entity%20Framework] –

+0

예, 제가 작성한 이후로 고려 사항이 변경되었습니다. 이 대답은 8.5 년 전이었습니다. –

1

나는 오라클에서 처음 생성 된 db 인 163 엔터티의 스키마와 EF6을 사용하고 있습니다.

측정 중 인덱싱 된 테이블에서 100 개의 레코드를 가져 오는 초기화 시간과 시간.

C# 테스트

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