시작 시간 문제를 해결하려고합니다. 프로파일 링을 한 후에는 주된 원인이 ClassProxyGenerator.GenerateCode라는 것을 알았습니다. 처음에는 유형 당 400-600 밀리 초가 걸립니다. 따라서 응용 프로그램의 진입 점에 프록시가 필요한 8 개의 종속성 (체인)이 있으면 응용 프로그램의 시작 시간이 4.8 초 늘어납니다. 이것은 많은 것처럼 보이지 않을 수도 있지만 사용자에게는 연령대처럼 보입니다.DynamicProxy 생성 속도
개선을위한 조언이 있으십니까?
업데이트 : 나는 다음과 같은 콘솔 응용 프로그램과 함께 시간을 재현 할 수
:
var container = new WindsorContainer();
container.Register(Component.For<Interceptor>()); // dummy IInterceptor...does nothing
container.Register(Component.For<IMyRepository, MyAbstractRepository>().Interceptors<Interceptor>());
var t = DateTime.Now;
var instance = container.Resolve<IMyRepository>();
Debug.WriteLine("Resolved in " + (DateTime.Now - t).TotalMilliseconds);
출력을 어딘가에 550ms와 750ms 사이.
IMyRepository는 (T4 템플릿에 의해 생성 된) 30 개의 개체 유형에 대한 저장소 인터페이스입니다. 31 개의 IQueryables, 31 개의 Save overloads 및 31 개의 Delete overloads가 있습니다. MyAbstractRepository는 부분 추상 클래스입니다. 동일한 3 x 31 메소드를 선언합니다.
내가 제거하면 모든 저장 방법을 삭제하고 단지 31 IQueryables을두고 추상적 인 저장소를
container.Register(Component.For<IMyRepository>().Interceptors<Interceptor>());
난 아직 초기 세대 약 250 밀리 실행을 등록하지 않습니다.
이것은 매우 (아주) 매우 빠른 기계입니다 ... 그래서 실제 세계에서는 위의 수치보다 느리게 수행 될 가능성이 높습니다.
말도 안됩니다. 유형에 수백/수천 개의 메소드가 있거나 (예 : 20 야 머신에서 코드를 실행중인 경우) 그렇지 않아도 말도 안됩니다. 고립 된 복제물을 만들 수 있습니까? –
알아요 ... 20 살짜리 머신이 아닙니다 ...이 홀드 업을 가진 특정 유형의 세트 인 것 같습니다 (다른 것은 5-10ms 내에 생성됩니다) ... 나는 코드 샘플을 분리하여 제공 할 것입니다. – Jeff
사용이 지연 될 수있는 종속성이있는 경우 가상 프록시 뒤에서 종속성 그래프의 해당 부분을 숨길 수 있습니다. 이 개념에 대한 개요는 다음을 참조하십시오. http://blog.ploeh.dk/2011/03/04/ComposeObjectGraphsWithConfidence.aspx –