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

Java Discussion :

Optimisation de code java


Sujet :

Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 8
    Par défaut Optimisation de code java
    Bonjour,
    Je travaille actuellement sur l'optimisation de code java.
    Mes connaissances sur des langages "classiques" C/C++, FORTRAN, m'ont permis d'arriver à des résultats très satisfaisants.

    J'observe maintenant un comportement supprenant du code sur lequel je travaille (celui-ci s'exécute en environ 100 ms).

    -- 1
    Sur une même machine, j'observe un temps d'exécution nettement différent selon que le code est exécuté depuis Eclipse ou directement en ligne de commande de type "java maClass"

    Je ne comprend pas comment l'exécution peut etre plus rapide lorsque le code est exécuté depuis Eclipse !!!!! A la rigueur, le contraire m'étonnerait moins !

    --2
    L'algorithme sur lequel je travaille est appelé une fois. Il s'exécute en environ 100 ms.
    si je boucle sur l'appel de cet algorithme, sont temps d'exécution décroit rapidement pour arriver à 50 ms dès la 2 ou 3 ieme execution.
    Toutes les opérations effectuées par le code (instanciations,...) le sont à chaque itérations, les résultats sont strictement identiques.

    Bref j'ai du mal à comprendre ce qui se passe :
    * le GC n'intervient pas durant la boucle
    * aucune classe n'est chargée
    * ...

    Donc si quelqu'un a une idée sur ce qui peut engendrer se phénomène, j'aimerai bien la connaitre.

    Merci beaucoup
    --

  2. #2
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    bonjour,

    pour ta 1ere interogation effectivement, normalement c'est l'inverse !!! c'est a creuser ???

    pour la 2eme en revanche je peut te dire que c'est normal car lors de la première boucle en fait les classes sont chargées en mémoire au sein de la JVM. Ce qui n'est pas le cas pour la 2eme et la Neme boucle.
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre Expert
    Avatar de hasalex
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 879
    Par défaut
    -- 1

    Tout dépend de ce que fait ton programme. Ce qui est certain, c'est qu'une sortie console est toujours coûteuse. Comme Eclipse redirige la sortie standard vers une zone interne, ça peut accélérer des choses.

    -- 2

    aucune classe n'est chargée
    Es-tu certain ? En Java, il est rare qu'on puisse programmer sans classes. Généralement, c'est effectivement le chargement initial des classes qui peut pénaliser le 1° passage, mais aussi le compilateur JIT (ou hotspot).

    Si tu veux analyser en détails ce qui se passe, tu as plusieurs outils. Je pense en particulier à :
    • Décompilateur JAD, pour voir le code que le compilateur a généré, sans te le dire
    • Outil jstat, pour analyser les temps de GC, le chargement de classes et le compilateur JIT

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par michubuntu Voir le message
    -- 1
    Sur une même machine, j'observe un temps d'exécution nettement différent selon que le code est exécuté depuis Eclipse ou directement en ligne de commande de type "java maClass"

    Je ne comprend pas comment l'exécution peut etre plus rapide lorsque le code est exécuté depuis Eclipse !!!!! A la rigueur, le contraire m'étonnerait moins !
    On pourrait avoir un ordre d'idée sur cette différence, ainsi que la manière dont tu calcules le temps d'exécution.

    Sinon quelques pistes :
    • Es-tu sûr d'utiliser exactement la même version de Java dans eclipse et via la console ?
    • Vérifies les paramètres du Run d'eclipse. Il pourrait y avoir certains paramètres qui améliorent les perfs...



    Citation Envoyé par michubuntu Voir le message
    --2
    L'algorithme sur lequel je travaille est appelé une fois. Il s'exécute en environ 100 ms.
    si je boucle sur l'appel de cet algorithme, sont temps d'exécution décroit rapidement pour arriver à 50 ms dès la 2 ou 3 ieme execution.
    Toutes les opérations effectuées par le code (instanciations,...) le sont à chaque itérations, les résultats sont strictement identiques.
    C'est grace au compilateur JIT (Just In Time) qui mixte compilation en natif plus ou moins poussé rapide et interprétation, et qui s'authorise à recompiler le code avec des optimisations plus poussé si cela s'avère neccessaire.

    Cela entraine une exécution un peu plus lente des premièrs appels, mais permet des rapports temps de chargement/performances équilibré...

    A noter que si tu veux des performances brutes, tu peux te tourner vers la JVM server


    Citation Envoyé par Alkhan Voir le message
    pour ta 1ere interogation effectivement, normalement c'est l'inverse !!! c'est a creuser ???
    Pourquoi ??? Il ne devrait normalement pas y avoir de différence notable...

    a++

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 8
    Par défaut
    Citation Envoyé par hasalex Voir le message
    -- 1

    Tout dépend de ce que fait ton programme. Ce qui est certain, c'est qu'une sortie console est toujours coûteuse. Comme Eclipse redirige la sortie standard vers une zone interne, ça peut accélérer des choses.
    J'y ai bien pensé, mais j'ai fait des tests en redigeant la sortie vers un fichier, cela ne change rien !
    J'ai également testé les options du type -Xmsn et -Xmxn mais rien n'y fait, c'est plus rapide sous eclipse !!!

    Citation Envoyé par hasalex Voir le message
    -- 2



    Es-tu certain ? En Java, il est rare qu'on puisse programmer sans classes. Généralement, c'est effectivement le chargement initial des classes qui peut pénaliser le 1° passage, mais aussi le compilateur JIT (ou hotspot).

    Si tu veux analyser en détails ce qui se passe, tu as plusieurs outils. Je pense en particulier à :
    • Décompilateur JAD, pour voir le code que le compilateur a généré, sans te le dire
    • Outil jstat, pour analyser les temps de GC, le chargement de classes et le compilateur JIT
    Merci pour ces deux outils, et notamment jstat, très bien !

    Alors effectivement lorsque je dis que les classes sont déjà chargées, c'est parceque je force le chargement avant d'appeler mon algo.
    J'ai bien remarqué le chargement des classes ralenti l'exécution alors j'utilise :
    Class algoClass = Class.forName("maClass");
    afin de sortir le temps de chargement de la boucle.

    Parcontre HaHA, il y a bien de le compilateur JIT qui entre en jeux !!!
    Au premier passage, ( voir au deuxième ??? pourquoi ?) les classes sont compilées Just In Time ...

    Est'il possible de précompiler ces classes ?

    Merci pour vos conseils

  6. #6
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Pourquoi ??? Il ne devrait normalement pas y avoir de différence notable...
    Je suis entièrement d'accord avec le fait qu'il ne devrait pas y avoir de différence.
    Cependant j'ai souvent constater qu'il y avait malgré tout des différences de temps !
    Mais je n'ai pas essayé de chercher le pourquoi ! C'est peut être simplement lié a mon environnement, et à la mémoire disponible au moment des tests
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 8
    Par défaut
    Déjà Merci beaucoup pour votre aide !!!

    Citation Envoyé par adiGuba Voir le message
    Sinon quelques pistes :
    • Es-tu sûr d'utiliser exactement la même version de Java dans eclipse et via la console ?
    • Vérifies les paramètres du Run d'eclipse. Il pourrait y avoir certains paramètres qui améliorent les perfs...
    Bon j'avance sur ce point là !
    Après test (je n'y avais pas pensé), se sont les binaires compilés par Eclipse qui sont plus rapides que ceux compilés via ant+javac ????

    Après je ne sais pas pourquoi !
    • Même version de java
    • Compilation ant sans debug, et avec optimisation
    • Compilation Eclipse par defaut (donc en mode DEBUG ??? c'est quand même bizarre non ?)


    Une Idée ???
    Citation Envoyé par adiGuba Voir le message

    A noter que si tu veux des performances brutes, tu peux te tourner vers la JVM server ;
    C'est déjà le cas, j'utilise une VM 64 bit (mode server par défaut)

    Voila, voila
    J'avance
    Merci beaucoup

  8. #8
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par michubuntu Voir le message
    Est'il possible de précompiler ces classes ?
    C'est généralement ce que fait la JVM server... avec encore plus d'optimisation !

    Citation Envoyé par Alkhan Voir le message
    C'est peut être simplement lié a mon environnement, et à la mémoire disponible au moment des tests
    Je considère bien sûr que les deux exécutions sont faites dans le même environnement (avec les mêmes applications).

    C'est sûr que si eclipse n'est pas lancé lorsque tu lances en console, l'OS aura un peu plus de ressource disponible...



    Mais au risque de me répéter : il faut vérifier les versions de Java utilisé par eclipse et en mode console !


    a++

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 8
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Mais au risque de me répéter : il faut vérifier les versions de Java utilisé par eclipse et en mode console !
    HAHAH
    Effectivement il y a une différence de version.
    Je n'ai pas encore réussi à reproduire les résultats mais j'avance.
    Merci, merci, merci

    Juste une chose
    Eclipse qui est plus rapide utilise le compilateur SUN javac 1.6.0_07
    alors que ant javac 1.6.0_11

    En gros l'ancienne version semble plus rapide !!!
    A vérifier, je vous tiens au courant

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 280
    Par défaut
    Salut

    pour ton point 2, c'est normale.
    Par default hotspot est activé, et la vm optimisera un object a chaque passage, d'ou les temps d'execution en forme d'exponentiel decroissante:
    http://en.wikipedia.org/wiki/HotSpot

    Y a l'option -Xint pour l'empecher si tu en as reellement besoin pour comparer different implementation par exemple.


    ---
    Farid

Discussions similaires

  1. Optimisation d'un code java
    Par supcomingenieur dans le forum Langage
    Réponses: 3
    Dernier message: 07/05/2013, 19h18
  2. Optimisation code Java
    Par maccormick dans le forum Général Java
    Réponses: 22
    Dernier message: 04/05/2010, 18h17
  3. Optimisation code java
    Par artatnas dans le forum Général Java
    Réponses: 4
    Dernier message: 25/02/2009, 17h32
  4. Optimisation de code java
    Par opensource dans le forum Langage
    Réponses: 9
    Dernier message: 18/04/2008, 17h30
  5. [JAVA / Out Of Memory] Aide pour optimiser du code
    Par shaun_the_sheep dans le forum Général Java
    Réponses: 7
    Dernier message: 06/02/2007, 09h58

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