5 votes

Vitesse de génération des DynamicProxy

J'essaie de résoudre des problèmes de temps de démarrage. Après avoir fait du profilage, j'ai découvert que le principal coupable est ClassProxyGenerator.GenerateCode. Cela prend 400-600ms par type la première fois. Donc, si le point d'entrée de l'application a 8 dépendances (dans une chaîne) qui ont besoin de proxies générés, le temps de démarrage de l'application augmente de 4,8 secondes. Cela peut sembler peu, mais pour un utilisateur, c'est une éternité.

Des conseils pour améliorer cette situation ?

Mise à jour :

Je peux reproduire le temps avec l'application console suivante :

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

Les sorties se situent entre 550 ms et 750 ms.

IMyRepository est une interface de dépôt pour 30 types d'entités (générés par un modèle T4). Elle possède 31 IQueryables, 31 surcharges Save et 31 surcharges Delete. MyAbstractRepository est une classe abstraite partielle. Elle déclare les mêmes 3 x 31 méthodes.

Si je supprime toutes les méthodes de sauvegarde et de suppression et que je ne conserve que les 31 IQueryables ET que je n'enregistre pas le référentiel abstrait

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

J'utilise toujours environ 250 ms pour la génération initiale.

Il s'agit d'une machine très (très très) rapide... de sorte que, dans le monde réel, les performances seront probablement inférieures aux chiffres indiqués ci-dessus.

1voto

Lucero Points 38928

Il est possible d'effectuer l'initialisation du proxy dans un autre thread, de sorte que l'application elle-même puisse continuer à s'initialiser pendant que les proxies sont générés. Envisagez de mettre cette tâche en file d'attente dans le pool de threads.

Une autre option consiste à compiler les mandataires dans un fichier d'assemblage persistant, qui est ensuite sauvegardé sur le disque. Cela permettrait de réduire considérablement le temps de démarrage après la première exécution.

Je ne sais pas pourquoi les proxys dynamiques de Castle sont si longs à initialiser. Je ne les utilise pas, j'émets généralement le code directement (soit en tant que LCG pour les méthodes simples, et via Reflection.Emit pour les implémentations complètes). Je n'ai jamais eu de délais aussi longs, même en générant des centaines de méthodes LCG. Peut-être que l'utilisation d'une approche/bibliothèque différente (LinFu, etc.) pourrait également résoudre le problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X