web-dev-qa-db-fra.com

Impact sur les performances de l'utilisation de aop

Nous avons commencé à utiliser spring aop pour les aspects transversaux de notre application (sécurité et mise en cache pour le moment). 

Mon responsable s'inquiète de l'impact de cette technologie sur les performances, même s'il en comprend parfaitement les avantages.

Ma question, avez-vous rencontré des problèmes de performances liés à l'utilisation de aop (en particulier Spring aop)?

37
LiorH

Tant que vous avez le contrôle de votre AOP, je pense que c'est efficace. Nous avions quand même des problèmes de performances, donc nous n’avions pas le contrôle total selon notre raisonnement;) C’est principalement parce qu’il est important que quiconque écrit des aspects possède complet compréhension de tous les autres aspects dans le système et comment ils sont liés. Si vous commencez à faire des choses "intelligentes", vous pouvez vous débrouiller en un tournemain. Faire des choses intelligentes dans un grand projet avec beaucoup de personnes qui ne voient que de petites parties du système peut être très dangereux en termes de performances. Ce conseil s'applique probablement aussi sans AOP, mais AOP vous permet de vous tirer une balle dans le pied de manière très élégante.

Spring utilise également le proxy pour les oscillations de champ et thats , un domaine dans lequel il est facile d’obtenir des pertes de performances indésirables.

Mais étant donné que vous avez le contrôle, le seul véritable problème avec AOP est l’effet sur le débogage.

30
krosenvold

Si les performances risquent de poser problème, nous avons utilisé AspectJ avec un grand effet.

Parce qu'il utilise le tissage de code-octets (le temps de compilation par rapport à l'exécution fait toute la différence), c'est l'un des frameworks AOP les plus rapides du marché. Voir: Benchmarks AOP

24
Nathan

Quand je l'ai utilisé, je ne l'ai pas fait - mais mon application n'est pas votre application.

Si vous l'utilisez pour des appels utilisés dans une boucle très serrée, il existe un opportunité pour un impact important sur les performances. Si c'est juste utilisé pour vérifier la sécurité une fois par demande et mettre en cache différentes choses, je ne vois pas en quoi elle pourrait être significative - mais c'est pourquoi vous devriez profiler et évaluer l'indice votre app.

Je me rends compte que "mesurer avec votre application" n'est probablement pas la réponse que vous recherchiez, mais c'est peut-être bien celle que vous auriez devinée :)

17
Jon Skeet

Si vous utilisez une AOP basée sur un proxy, vous parlez d'une invocation de méthode Java supplémentaire par aspect appliqué. L'impact sur les performances est assez négligeable. La seule préoccupation réelle concerne la création des serveurs proxy, mais cela ne se produit généralement qu'une seule fois au démarrage de l'application. Le blog de SpringSource contient un excellent article à ce sujet:

http://blog.springsource.com/2007/07/19/debunking-myths-proxies-impact-performance/

5
cliff.meyers

En théorie, si vous utilisez AOP pour faire ce que vous pourriez faire avec un couplage dur, il n'y a pas de problème de performances, pas de surcharge, ni d'appels de méthode supplémentaires, sauf si vous tissez pour rien. AOP Framework vous offre un moyen de supprimer le couplage dur et de factoriser votre problème transversal.

En pratique, le cadre AOP peut introduire 3 types de frais généraux: 

  • temps d'incendie
  • mécanicien d'interception
  • intégration du consommateur (moyen de développer un conseil)

Pour plus de détails, vous pouvez vous référer à when-is-aop-code-execute .

Faites attention à la manière dont vous mettez en œuvre un conseil car le code transversal est une tentation pour la boxe/déballage et la réflexion (coûteuse en terme de performances). 

Sans AOP Framework (couplage dur de vos préoccupations transversales), vous pouvez développer vos conseils présumés (dédiés à chaque traitement) plus facilement sans boxing/unboxing ni réflexion.

Vous devez savoir que la plupart des frameworks AOP n'offrent pas le moyen d'éviter totalement la boxe/déballage et la réflexion.

J'en ai développé un pour répondre à la plupart des besoins manquants, concentré sur 3 choses:

  • convivial (léger, facile à apprendre)
  • transparent (pas de code de rupture à inclure)
  • efficace (pas de boxing/unboxing, pas de reflet dans le code d'utilisateur nominal et bon mécanisme d'interception)

Vous pouvez trouver mon projet open source ici: API Puresharp .net 4.5.2+ précédemment NConcern .NET AOP Framework

1
Tony THONG

Si vous utilisez une structure donnée pour certains aspects, il peut y avoir des problèmes de performances. Suivant si vous créez une abstraction supérieure à une structure et que la gestion des aspects est effectuée à partir de la structure, il est très difficile de déterminer la cause du problème lié aux problèmes de performances. Si vous êtes vraiment préoccupé par les performances et que vous vous souciez davantage de la tranche de temps, je suggère d’écrire ses propres aspects. Personne ne veut réinventer la roue, mais pour le meilleur il peut être préférable. Vous pouvez écrire sa propre mise en œuvre de l’abstraction de l’alliance AOP.

0
abishkar bhattarai

Avez-vous déjà pensé à un outil AOP permettant d'ajouter des aspects à un objet lors de l'exécution, le cas échéant? Il en existe un pour .net "Ajouter des aspects à un objet à l'aide de Dynamic Decorator" (http://www.codeproject.com/KB/architecture/aspectddecorator.aspx). Je crois que vous pouvez en écrire un similaire pour Java.

0
Gary

j'ai utilisé Spring AOP dans un traitement par lots de mon projet actuel pour gérer les transactions d'une base de données.

Au début, on pensait qu'il n'y aurait pas de problème de performances, mais nous n'avons pas intégré l'équation que nous avons appelée des milliers de fois. un appel d'aspect dans aop n'affecte pas beaucoup les performances, mais multipliez cela par des milliers, et il s'avère que le nouveau système était pire que l'ancien à cause de ces appels de méthodes supplémentaires.

Je dirais que aop est un excellent système à utiliser, mais essayez de noter le nombre d'appels de méthodes ajoutés à votre application.

0
Richard