5

시작 시간 문제를 해결하려고합니다. 프로파일 링을 한 후에는 주된 원인이 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 밀리 실행을 등록하지 않습니다.

이것은 매우 (아주) 매우 빠른 기계입니다 ... 그래서 실제 세계에서는 위의 수치보다 느리게 수행 될 가능성이 높습니다.

+1

말도 안됩니다. 유형에 수백/수천 개의 메소드가 있거나 (예 : 20 야 머신에서 코드를 실행중인 경우) 그렇지 않아도 말도 안됩니다. 고립 된 복제물을 만들 수 있습니까? –

+0

알아요 ... 20 살짜리 머신이 아닙니다 ...이 홀드 업을 가진 특정 유형의 세트 인 것 같습니다 (다른 것은 5-10ms 내에 생성됩니다) ... 나는 코드 샘플을 분리하여 제공 할 것입니다. – Jeff

+1

사용이 지연 될 수있는 종속성이있는 경우 가상 프록시 뒤에서 종속성 그래프의 해당 부분을 숨길 수 있습니다. 이 개념에 대한 개요는 다음을 참조하십시오. http://blog.ploeh.dk/2011/03/04/ComposeObjectGraphsWithConfidence.aspx –

답변

1

다른 스레드에서 프록시 초기화를 수행하여 프록시가 생성되는 동안 응용 프로그램 자체를 계속 초기화 할 수 있습니다. 이것을 스레드 풀에 대기시키는 것을 고려하십시오.

또 다른 옵션으로 프록시를 영구 어셈블리 파일로 컴파일 한 다음 디스크에 저장할 수도 있습니다. 이렇게하면 처음 실행 한 후 시작 시간이 크게 줄어 듭니다.

캐슬의 동적 프록시가 왜 그렇게 오래 초기화해야하는지 모르겠습니다. 나는 그들을 사용하지 않는다. 나는 보통 코드를 직접적으로 내 보낸다. (간단한 메소드의 경우 LCG로, 완전한 구현의 경우 Reflection.Emit을 통해). LCG 방법의 수백을 생성 할 때라도 나는 그런 장시간 지연이 결코 없었다. 어쩌면 다른 접근법/라이브러리 (LinFu 등)를 사용하여 문제를 해결할 수도 있습니다.