IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre actif Avatar de Chen norris
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    mai 2004
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : mai 2004
    Messages : 212
    Points : 246
    Points
    246
    Par défaut Création d'une annotation pour exécuter du code avant/après une méthode
    Bonjour à tous,

    En Java 7, je me pose la question de comment écrire une annotation custom pour exécuter du code avant et après une méthode (l'idée est de chronométrer le temps d'exécution de certaines de mes méthodes).
    La méthode classique mais que je trouve redondante est de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void maMethode() {
        long debut = new Date().getTime();
        // ici le contenu de la méthode
        System.out.println("Durée : " + new Date().getTime() - debut);
    }
    (l'exemple ici reste volontairement simple, l'usage de new Date(), getTime() ou même System.out.println n'est pas du tout la question)

    En réalité, mon cas est un tout petit peu plus compliqué puisqu'il stocke les durées d'exécution des méthodes qui sont appelées plusieurs fois pour n'afficher que leur temps moyen d'exécution à la toute fin de mon programme.
    Dans les faits, ça donne quelque chose dans ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void maMethode() {
        startBench("un identifiant quelconque");
        // ici le contenu de la méthode
        stopBench("un identifiant quelconque");
    }
    Dans l'idée, je pensais créer une annotation du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface Bench {
        String value();
    }
    et l'utiliser comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @Bench("un identifiant quelconque")
    public void maMethode() {
        // ici le contenu de la méthode
    }
    Mais voilà : comment faire en sorte d'exécuter startBench("un identifiant quelconque"); avant d'exécuter ma méthode et stopBench("un identifiant quelconque"); à la fin de ma méthode ?

    Après moults recherches sur le net, impossible de trouver une solution pour ce problème qui me semble pourtant élémentaire...
    Je précise que la solution que je recherche concerne une vraie application, pas une "application" web.
    J'aimerais idéalement définir une méthode onStart et une méthode onFinish dans mon annotation mais comment faire en sorte qu'elles soient appelées automatiquement ?

    Merci d'avance pour votre aide et vos pistes
    Chen norris
    C/C++, C#, Java, PHP & SQL coder
    Web developer

  2. #2
    Membre habitué
    Homme Profil pro
    Architecte technique
    Inscrit en
    mai 2020
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : mai 2020
    Messages : 114
    Points : 148
    Points
    148
    Par défaut
    Bonjour,

    Je pense qu'il y à deux solutions:

    La première serait d'utiliser un framework d'AOP (Aspect Oriented Programming) dans votre application. Certains fonctionnent avec des déclarations de point de coupe, d'autres avec des annotations à vous de voir ce qui vous convient le mieux.

    L'autre solution est de créer un processeur d'annotations que vous renseignez à votre compilateur. Mais il faudra faire de la manipulation de code pour injecter vos appels startBench et stopBench au début et à la fin de votre méthode plus gèrer les try { .. } catch { .. } finally { .. }.


    Une troisième approche, qui n'est pas vraiment une réponse à votre question, serait d'utiliser une librairie existante pour faire ce travail. C'est à mon sens (sans connaître vos besoins) la solution la plus efficace.

  3. #3
    Membre actif Avatar de Chen norris
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    mai 2004
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : mai 2004
    Messages : 212
    Points : 246
    Points
    246
    Par défaut
    Bonjour

    Pour éclaircir un peu le domaine auquel cela doit s'appliquer, il s'agit d'une application client lourd qui grosso modo pourrait s'apparenter à un moteur 3D basé sur OpenGL. Pour reprendre les solutions proposées :

    1. Les librairies existantes sont malheureusement souvent basées sur des annotations Spring ou autre, et répondent du coup plutôt à des besoins lié au web (configuration des annotations via des beans définis dans des configurations Tomcat, par exemple). La plupart des solutions sur lesquelles je tombe sont basées là-dessus, malheureusement pour moi… J'ai donc écarté cette option pour le moment.

    2. Le processeur d'annotation est une piste que j'ai commencé à explorer, mais je me suis rendu compte qu'au final, je devais explicitement lancer ce processeur d'annotations pour qu'il s'exécute. Mon application étant lancée comme un programme, lancer un processeur d'annotation en pré-requis me paraît un peu lourd et coûteux en terme de vitesse d'exécution (mes contraintes sont de garder une application qui s'ouvre rapidement et qui maintienne une vitesse d'exécution élevée pour garantir les 60 FPS).

    3. En troisième solution, l'approche AOP m'intéressait beaucoup car semblant la plus adaptée à mes besoins. Mais mes connaissances sont un peu trop limitées dans ce domaine, et je n'arrive pas à savoir comment m'y prendre techniquement.
    Je n'arrive pas à savoir si :
    • une annotation sur une méthode permet de déclencher un traitement au moment où la méthode en question se lance,
    • un listener doit être mis en place quelque part, en scannant toutes les méthodes annotées au préalable


    Si c'est la première option, l'idée serait d'encapsuler l'appel à la méthode, en l'encadrant par mes startBench / stopBench.
    Si par contre c'est la seconde option, pas sûr encore une fois que ça respecte mes contraintes concernant la vitesse d'exécution…

    Je ne sais pas si tout cela est très clair, n'hésitez pas en cas d'interrogation ^^
    Chen norris
    C/C++, C#, Java, PHP & SQL coder
    Web developer

  4. #4
    Membre expérimenté
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    juillet 2006
    Messages
    1 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : juillet 2006
    Messages : 1 196
    Points : 1 694
    Points
    1 694
    Par défaut
    il existe une solution particulièrement facile et crade (quick and dirty) : mettre aux points critiques un assert qui lance une méthode qui rend toujours true
    après tu exécutes avec ou sans assertion activée!
    assert n'est pas du tout fait pour ça mais hein c'est "facile et crade"
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (un peu de pub pour mon site: http://scrountch.info/java )

  5. #5
    Membre actif Avatar de Chen norris
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    mai 2004
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : mai 2004
    Messages : 212
    Points : 246
    Points
    246
    Par défaut
    Effectivement, un usage détourné assez particulier, j'y aurais pas pensé...

    Mais vu ce qu'il implique, au final, appeler manuellement mes méthodes startBench et stopBench respectivement en début et en fin des methodes à mesurer est à peine plus coûteux, et surtout un peu plus propre.
    Chen norris
    C/C++, C#, Java, PHP & SQL coder
    Web developer

  6. #6
    Membre expérimenté
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    juillet 2006
    Messages
    1 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : juillet 2006
    Messages : 1 196
    Points : 1 694
    Points
    1 694
    Par défaut
    l'avantage du "assert" détourné c'est que tu peux activer tes méthodes à la demande (l'exécution n'en est pas systématique) et ça c'est important!
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (un peu de pub pour mon site: http://scrountch.info/java )

Discussions similaires

  1. Réponses: 5
    Dernier message: 08/04/2020, 15h30
  2. Réponses: 4
    Dernier message: 16/09/2010, 18h30
  3. quelques problèmes pour exécuter mes codes
    Par djimangue dans le forum Langage
    Réponses: 6
    Dernier message: 18/12/2007, 02h00
  4. Pas assez de mémoire pour exécuter un code
    Par med_ellouze dans le forum Langage
    Réponses: 6
    Dernier message: 11/08/2007, 03h51
  5. Allocation mémoire pour exécution de code généré
    Par mchk0123 dans le forum x86 32-bits / 64-bits
    Réponses: 6
    Dernier message: 06/04/2007, 17h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo