5

Estoy intentando solucionar algunos problemas de tiempo de inicio. Después de hacer algunos perfiles, he descubierto que el principal culpable es ClassProxyGenerator.GenerateCode. Esto toma 400-600ms por tipo la primera vez. Entonces, si el punto de entrada a la aplicación tiene 8 dependencias (en una cadena) que necesitan proxies generados, el tiempo de inicio de la aplicación aumenta en 4.8 segundos. Esto puede no parecer mucho, pero para un usuario, parece que es una eternidad.DynamicProxy Generation Speed ​​

¿Algún consejo para mejorar esto?

Actualización:

puedo reproducir el tiempo con la siguiente aplicación de consola:

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

salidas en algún lugar entre 550 ms y 750 ms.

IMyRepository es una interfaz de repositorio para 30 tipos de entidad (generada por una plantilla T4). Tiene 31 IQueryables, 31 Save overloads, y 31 Delete overloads. MyAbstractRepository es una clase abstracta parcial. Declara los mismos métodos 3 x 31.

Si quito todo el guardar y eliminar métodos y dejar sólo los 31 IQueryables Y no se registre el repositorio abstracta

container.Register(Component.For<IMyRepository>().Interceptors<Interceptor>()); 

Todavía corro alrededor de 250 ms para la generación inicial.

Esta es una máquina muy (muy, muy) rápida ... por lo que cualquier cosa en el mundo real probablemente rinda más lento que los números enumerados anteriormente.

+1

Eso es ridículo: a menos que sus tipos tengan cientos/miles de métodos (o está ejecutando el código en una máquina de 20 yo), ese no debería ser el caso. ¿Puedes crear una reproducción aislada? –

+0

Lo sé ... y no es una máquina de 20 años ... Parece que hay un conjunto específico de tipos que tienen esta retención (otros generan en 5-10ms) ... Aislaré y proporcionaré una muestra de código. – Jeff

+1

Si tiene dependencias donde el uso puede diferirse, es posible que pueda ocultar esa parte del gráfico de dependencia detrás de un proxy virtual. Consulte aquí para obtener una descripción general del concepto: http://blog.ploeh.dk/2011/03/04/ComposeObjectGraphsWithConfidence.aspx –

Respuesta

1

Es posible que pueda realizar la inicialización del proxy en un subproceso diferente, para que la aplicación en sí pueda continuar inicializándose mientras se generan los proxies. Considera poner esto en cola en el threadpool.

Otra opción podría ser compilar los proxies en un archivo ensamblado persistente, que luego se guarda en el disco. Hacer esto reduciría significativamente el tiempo de inicio después de la primera ejecución.

No estoy seguro de por qué los proxies dinámicos de Castle tardan tanto en inicializarse. No los uso, generalmente emito código directamente (ya sea como LCG para métodos simples, y a través de Reflection completo. Solicite implementaciones completas). Nunca tuve retrasos tan largos, incluso cuando se generan cientos de métodos LCG. Tal vez usar un enfoque/biblioteca diferente (LinFu, etc.) podría solucionar el problema también.