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

avec Java Discussion :

Optimisation du code


Sujet :

avec Java

  1. #1
    Membre chevronné

    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 974
    Points : 1 825
    Points
    1 825
    Par défaut Optimisation du code
    Bonjour,

    pour coder un problème, il existe le plus souvent plusieurs solutions. Existe-t-il un outil (librairie, et..) qui permet de tester l'efficacité du code (vitesse, consommation mémoire, cpu, ..) pour évaluer ces solutions ?

    exemple:

    pour la vitesse d'exécution, faut-il mieux utiliser StringTokenizer ou "split + regex" pour découper une "phrase" en "mot". Réponse: utilisation de cet outil ou alors la seule possibilité est d'englober le traitement dans une boucle avec par exemple, 100000 itérations.

    merci

  2. #2
    Membre éclairé Avatar de Ceddoc
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2009
    Messages : 493
    Points : 698
    Points
    698
    Par défaut
    ça dépend ce que tu veux faire, pour ton exemple tu peux déclencher un timer avant et le stopper après avoir fait une boucle de 1000 String tokenizer ou split plus regex.

    Mais après tu as des outils genre Jprofiler pour analyser ce qui prend du temps dans ton appli et les fuites mémoires éventuelles

  3. #3
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    +1
    Pour ta question, clairement éviter le split sur String, il est incroyablement lent dans le cas d'une utilisation "simple" comme celle que tu veux faire.

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 974
    Points : 1 825
    Points
    1 825
    Par défaut
    Citation Envoyé par chtig Voir le message
    +1
    Pour ta question, clairement éviter le split sur String, il est incroyablement lent dans le cas d'une utilisation "simple" comme celle que tu veux faire.
    L'exemple StringTokenizer et "split+regex" est justement qu'un exemple qui n'aborde que la vitesse de traitement.

    En fait, je cherche un (ou plusieurs) outil(s) qui permet(tent) d'obtenir des mesures de vitesses, de consommation mémoires, consommation cpu et autres pour optimiser le code (ou du moins, certaines parties).

    je vais regarder "jprofiler" qui comme son nom le laisse supposé, doit ressembler au profiler type langage C

    merci

  5. #5
    Membre éclairé Avatar de Ceddoc
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2009
    Messages : 493
    Points : 698
    Points
    698

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par chtig Voir le message
    +1
    Pour ta question, clairement éviter le split sur String, il est incroyablement lent dans le cas d'une utilisation "simple" comme celle que tu veux faire.
    StringTokenizer n'est pas beaucoup plus rapide (il prend environ 80% du temps d'un String.split pour des token simples). De plus, le plus gros du travail pour split, c'est la construction du tableau. Pour cela il rajoute à une arraylist pour ensuite la convertir en array. Le Stringtokenizer ne retourne pas de tableau tout propre. Si on compare ce qui est comparable (obtention d'un array), j'arrive à 92%. Un Pattern.split deviens même plus rapide qu'un Stringtokenizer reconstruisant l'array.


    Quand on optimise, il faut savoir de quoi on parle. On n'optimise pas une ligne de code juste pour le principe, c'est le meilleur moyen de tomber sur les anti pattern de early optimization.

    On réalise un code raisonnable et facile à maintenir. Ensuite on utilise un profiler pour trouver et optimiser les "points chauds". Parce que franchement, entre passer 0.0019 ms sur un split ou 0.0016 ms sur un String tokenizer... Faut vraiment être critique pour se passer du confort du split

  7. #7
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par tchize_ Voir le message
    On réalise un code raisonnable et facile à maintenir. Ensuite on utilise un profiler pour trouver et optimiser les "points chauds".
    +1000



    Surtout que cette affirmation vient du principe que regexp==lent, ce qui n'est pas forcément vrai !
    En plus dans certains cas split() n'utilise pas de regexp sous Java 7 (et peut-être même avant mais je n'en suis pas sûr).

    En effet si on utilise split() avec une chaine d'un seul caractère "simple", alors cela n'utilise pas les regexp mais un algo basé sur des indexOf(), ce qui donne chez moi un résultat 2 fois plus performant que Tokenizer (en créant aussi un tableau)...



    Enfin si l'on a vraiment besoin de regexp avec split(), on peut toujours précompiler le pattern, car c'est ce qui coûte le plus cher en temps...


    a++

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Enfin si l'on a vraiment besoin de regexp avec split(), on peut toujours précompiler le pattern, car c'est ce qui coûte le plus cher en temps...


    a++
    mm non, quand j'ai testé ici, la compilation du pattern comptait pour à peu près 20% du temps de split.

    Mais ca dépend aussi de la taille de la chaine à couper par rapport à la taille de la pattern.

    Bref: on en reviens au point de départ: mesurer le cas d'utilisation réel

  9. #9
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    En effet la taille de la chaine influence beaucoup le temps, sûrement à cause de la création du tableau !!!


    Comme tu le dis, c'est le problème lorsqu'on tente d'optimiser alors qu'il n'y a pas de problème : non seulement on se complique la vie, mais on risque en plus de s'apporter des problèmes de perfs à cause de choix extrême non-adapté !



    a++

  10. #10
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    100% d'accord avec vous sur le "faire un code propre et optimiser ensuite si besoin est".
    Et au temps pour moi sur le split, j'avais zappé que ça avait été changé en Java7

    Pour info, je ne disais pas ça uniquement sur le principe que regexp=lent, mais simplement pour l'avoir vécu. Dans un site de moteur de recherche, qui utilisait un moteur d'indexation qui ne savait pas gérer de clés composites, on obtenait une clé résultante qu'il fallait ensuite split sur un caractère simple pour retrouver la donnée. Lorsqu'on a fait des tests de profiling, on s'est aperçu que 30% du temps global de traitement d'une recherche utilisateur était passé à faire du split ! On a du coup codé un split à la mano tout simple, et on a gagné 30% de perfo.

  11. #11
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par chtig Voir le message
    Pour info, je ne disais pas ça uniquement sur le principe que regexp=lent, mais simplement pour l'avoir vécu. Dans un site de moteur de recherche, qui utilisait un moteur d'indexation qui ne savait pas gérer de clés composites, on obtenait une clé résultante qu'il fallait ensuite split sur un caractère simple pour retrouver la donnée. Lorsqu'on a fait des tests de profiling, on s'est aperçu que 30% du temps global de traitement d'une recherche utilisateur était passé à faire du split ! On a du coup codé un split à la mano tout simple, et on a gagné 30% de perfo.
    Pareil. Mais même si l'utilisation de regex dans split() faisait perdre un peu de temps (faut dire aussi qu'il la recompilait à chaque split() -_-°,) ce qui bouffait vraiment du temps c'est que split() ne connaît pas a priori le nombre d'éléments qu'il va renvoyer mais qu'il renvoie un tableau de pile la bonne taille. Du coup il construit une ArrayList pour mettre les éléments dedans, puis il la copie en tableau. Lourde perte de temps.
    Mais cela n'est gênant que si on enchaîne les split() par millions. Si on en fait un toutes les 36 du mois c'est sans importance.
    Donc, pour savoir si on est dans ce cas => profiling d'abord, optimisation ensuite.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. optimiser le code d'une fonction
    Par yanis97 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 15/07/2005, 08h41
  2. Optimiser mon code ASP/HTML
    Par ahage4x4 dans le forum ASP
    Réponses: 7
    Dernier message: 30/05/2005, 10h29
  3. optimiser le code
    Par bibi2607 dans le forum ASP
    Réponses: 3
    Dernier message: 03/02/2005, 14h30
  4. syntaxe et optimisation de codes
    Par elitol dans le forum Langage SQL
    Réponses: 18
    Dernier message: 12/08/2004, 11h54
  5. optimisation du code et var globales
    Par tigrou2405 dans le forum ASP
    Réponses: 2
    Dernier message: 23/01/2004, 10h59

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