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 code Java


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 116
    Par défaut Optimisation code Java
    Bonjour à tous,
    Je me suis inspiré d'une application développée en VB pour faire une autre application en Java. Ces deux applications font absolument les mêmes choses, tournent sur des postes client en local toutes les deux, donnent les mêmes résultats (des statistiques sur des listes de discussion), sauf que celle en VB le fait en 5 minutes, et la mienne (en Java) en 3 heures !
    J'ai chronométré les différents processus de mon appli mais je n'arrive pas bien à voir où et pourquoi j'ai des temps de calcul aussi long.
    D'où mes questions :
    - je me sers d'h2 pour la base de données : est-ce la plus rapide ?
    - certaines requêtes comme les "update" ou les "select" sont super longs
    - j'avais entendu des trucs sur la boucle for : comme j'en utilise plein, est-ce que cela peut ralentir mon application ? si oui, qu'utiliser ?
    - vaut-il mieux faire des requêtes sur une bdd ou écrire dans des fichiers (j'ai l'impression que ce dernier prend moins de temps!!)
    - quel est le plus rapide dans la création/lecture/accession/manipulation entre un ArrayList, un tableau normal, un hashset, un tableau chaîné (même si je sais que tous ces tableaux sont très particuliers et réservés à des utilisations précises, je ne sais jamais lequel choisir lorsque ce que j'ai à faire dessus les concerne tous !!)
    - lorsqu'on a un long traitement à faire, vaut-il mieux séparer les processus le plus possible (faire plein de void qu'on appelle d'une classe principale) ou faire un gros void énorme ?
    - dans le même ordre d'idées, faut-il cloisonner ou décloisonner son programme, faire plein de classes très courtes, ou peu de classes très longues ?

    Donc voilà, en gros, je me demande comment on optimise son code JAVA (hors algo car c'est un autre problème !) ???!!!
    Merci à tous de vos nombreuses aides et réponses et orientations !

    mc

  2. #2
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    je me demande comment on optimise son code JAVA (hors algo car c'est un autre problème !)
    C'est là que tu as tout faux : d'abord on reflechit à son code, on apprends l'algo, et ENSUITE on optimise.

    Pour te donner un ordre d'idée : passer de 0,2 sec à 0,05 sec est une optimisation, 3h au lieu de 5 minutes, c'est un mauvais code.

    Cherche sur internet les bonnes pratiques de la programmation, les bases d'algorithmique et les bases du sql.

    Si après tu veux des conseils plus 'pratique', poste une partie de ton code pour qu'on puisse le commenter.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Par défaut
    Salut,

    Si tu es sous eclipse, je te suggère d'installer les plugins checkstyle/pmd qui permettent de contrôler ton code (lisibilité, performances...), qui pourront te permettre de repérer des éventuelles bourdes dans ton code (genre des variables déclarés dans des boucles, un appel de fonction pour définir le nombre d'itérations dans une boucle for, ...) mais bon, à moins que ton programme se résume à une boucle exécutée 300000 fois, ça risque de pas être vraiment significatif...

    Autre plugin sympa qui peut t'aider(que je maitrise po tout à fait ^^), c'est TPTP
    C'est un plugin qui te permet de voir à la fin de ton programme quels ont étés les traitement les plus consommateurs de temps, les appels de fonctions qu'il y a eu, etc....
    Bref, moi ça m'a permit de trouver dans le code un Reader que j'ai remplacé par un BufferedReader, et vu qu'il y avait 100000 lectures dessus, j'ai divisé le temps d'exécution par 2 !

    Bon courage pour ton optim et tiens nous au courant !

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Par défaut
    Je pense que ton portage en java n'est pas top dû a ton expérience dans ce langage.
    pour passer de 2h a 5minutes faut faire un très grand ménage dans ton code
    Montre nous la partie qui consomme le plus de temps, on essayera de voir ce qu'on pourra faire.
    A++

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 116
    Par défaut
    Salut
    Faiche : oui tout à fait, il y a de gros soucis d'algo à mon avis aussi, mais quand on traite 30000 lignes dans une base de données, l'optimisation peut entrer en jeu aussi non ?
    Legentil : merci, je vais regarder ça de plus près
    Hibour : le souci c'est que je ne connais absolument pas les algos du soft en VB, sinon tu penses bien que je les aurais repris !

    A tous : je suis très conscient d'avoir des soucis d'algo et je vais reprendre tout ça, mais y-a-t'il aussi des trucs vraiment à éviter (boucle for, bdd h2 ... etc) ?

    @+

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Par défaut
    Je pensai que t'avais le code source VBA sous les yeux.
    Comme ca on ne pourra pas t'aider sans code!

  7. #7
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    Si tu fais de l'i/o, est ce que tu utilises les buffers ?

    Est ce que t'es sur que les traitements ne sont pas parallélisés dans la version VB ?

    Pour calculer la complexité de tes boucles, c'est simple : plus elles sont imbriquées, plus elles prendront de temps.

    30000 lignes dans une base, c'est rien. Mais après ça dépend de ton niveau en SQL. Si tu as un doute, tu poses la question sur ta requete et ton schéma sur le forum correspondant. J'ai vu des applis qui mettaient 25 minutes à mal faire ce qu'une requete bien faite aurai mis 0,25 secondes à bien faire.

    La différence entre "un gros void" et "plusieurs petits void" c'est une question de conception. On ne met pas tout dans la meme classe. Une classe doit faire une chose, pas plusieurs, mais ça n'influe pas sur les performances.
    (Je passe sur les gros et petits void, ça ne veut rien dire, mais on comprends l'idée.)

    Si tu fais beaucoup de concaténations de chaine (String) regarde les cours, pour savoir quand utiliser + et quand utiliser StringBuilder.

    pour l'instant c'est tout ce que je vois.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 50
    Par défaut
    Le SQL peut également jouer un grand rôle dans l'affaire...
    Attention à l'exécution des requêtes, aux commit etc.

  9. #9
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Citation Envoyé par Faiche Voir le message
    La différence entre "un gros void" et "plusieurs petits void" c'est une question de conception. On ne met pas tout dans la meme classe. Une classe doit faire une chose, pas plusieurs, mais ça n'influe pas sur les performances.
    (Je passe sur les gros et petits void, ça ne veut rien dire, mais on comprends l'idée.)
    Il y a quand même un prix à l'utilisation de beaucoup de classes et de plein de petites méthodes, les invocations successives. Dans le cas présent, ça ne doit pas du tout jouer, mais ça peut être un facteur d'optimisation (avec l'inlining).

    Sur le cas présent : tu utilises les même procédures / requêtes SQL que le code VB ? Si oui, on peut penser que le problème ne vient pas de là. Si non, on peut supposer qu'il vient de là

  10. #10
    Membre chevronné Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Par défaut
    Citation Envoyé par maccormick Voir le message
    A tous : je suis très conscient d'avoir des soucis d'algo et je vais reprendre tout ça, mais y-a-t'il aussi des trucs vraiment à éviter (boucle for, bdd h2 ... etc) ?
    Ben cherche pas alors, apprends ce qu'est une estimation du temps de calcul d'un programme simple (dans un langage quelconque, l'algorithmique n'est pas dépendante d'un langage...). Ensuite tu comprendras pourquoi ton code est lent

    A savoir que ce qui prends du temps dans tout programme en général, ceux sont les opération d'entrées/sorties : les limiter tu dois ! ().

    Bon courage

  11. #11
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    je plusoie les gens qui te disent de checker ton SQL. On peut traiter 30.000 lignes sql en quelques millisecondes avec un bon SGDB. Par contre si on commence à faire soi même le boulot du SGBD c'est la cata, et c'est là que pêchent les débutants. Par exemple faire une boucle for sur les 30.000 ligne pour trouver la ligne à modifier et la modifier au lieu de faire un update ... where ..... Ce qui plombe dans ces cas, dans 99% du temps c'est que tu force le SGDB à sortir tous les résultat pour en jeter à la poubele 99.9% alors que tu pourrais lui demander de juste sortir le résultat qui t'intéresse.

    Maintenant, sans les bout de code, l'algo, les requetes SQL, on ne fait que conjecturer dans le brouillard total.

+ Répondre à la discussion
Cette discussion est résolue.

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 artatnas dans le forum Général Java
    Réponses: 4
    Dernier message: 25/02/2009, 17h32
  3. Optimisation de code java
    Par michubuntu dans le forum Général Java
    Réponses: 9
    Dernier message: 23/01/2009, 16h42
  4. Optimisation de code java
    Par opensource dans le forum Langage
    Réponses: 9
    Dernier message: 18/04/2008, 17h30

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