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.
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? –
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
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 –