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 :

[JVM] Optimiser l'exécution


Sujet :

Java

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2016
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2016
    Messages : 1
    Points : 0
    Points
    0
    Par défaut [JVM] Optimiser l'exécution
    Bonjour,
    mon collègue m'a posé une question que je trouve pertinente mais dont je n'ai pas la réponse. J'ai bien évidemment cherché sur le net mais je n'ai pas eu de réponse.

    Voici la fameuse question :
    "Quelle est la méthode la plus rapide pour le compilateur pour comparer des nombres?"
    proposition 1 : mon nombre (X) != 2
    proposition 2 : mon nombre (X) <= 2

    Pour vous résumer le cas d'utilisation, on doit faire des tests (des centaines de milliers) sur des int qui sont des indicateurs.
    Je ne peux pas vous en dire plus, mais on doit optimiser le code pour gagner en temps d'exécution.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    On peut optimiser l'exécution de la JVM pour pas mal de choses, mais cela concerne essentiellement la gestion de la mémoire (et en particulier du Garbage Collector), la gestion des entrées/sorties, le chargement/l'instanciation d'objets, ce genre de choseq. Les calculs et comparaisons sont souvent effectuées par le processeur et son unité arithmétique et logique, ou dans certains cas délégués à des composants plus puissants en calcul comme les GPU, ce qu'on ne peut pas faire directement en Java, mais qui est possible via JNI/JNA. Il y a aussi différentes JVM et certaines sont peut-être dédiées aux calculs et comparaisons et donc optimisées pour.

    On peut aussi parfois avoir le choix entre différentes syntaxes Java, dont certaines peuvent être plus performantes que d'autre, et l'architecture du programme peut aussi avoir son importance, sans parler de mettre en place des caches, des pools, etc.

    Et puis il y a les optimisations du compilateur qui va en sorte réécrire du code à sa sauce pour optimiser. Se prendre la tête pour écrire une expression qui sera de toute manière remaniée n'a pas d'intérêt.

    Quoiqu'il en soit, je ne sais pas si c'est une faute de frappe, ou pas, mais choisir entre (X) != 2 et (X) <= 2, ne relève pas des performances, mais de l'algorithme, ces deux contions n'étant pas du tout équivalentes. Éventuellement le choix entre x!=2 et (x<2 || x>2) pourrait avoir un sens, ou entre (x!=2) et !(x==2). En plus dans ce cas, je suis à peu près sûr que le compilateur choisi de lui-même la méthode qui convient le mieux. Et je suis à peu près sûr que l'accès à la valeur de x (accès mémoire, copie dans un registre) est bien plus pesante (hors cache, parce que dans les machines modernes il faut aussi tenir compte des multiples caches, à tous les niveaux, sans parler du swapping qui vient foutre son dawa dans l'histoire) que la comparaison elle-même.

    Et puis l'optimisation, on y travaille surtout quand le code fonctionne mais que les performances ne sont pas acceptables (je ne dis pas qu'il y a des domaines où il faut être super synchrone...). Avec un profiler on détecte les points qui prennent vraiment du temps et sur lesquels on estime qu'on peut gagner beaucoup de temps en travaillant le moins possible (parce ce que s'il faut un an de prise de tête pour gagner 1 ms, ça n'a aucun intérêt) et on travaille dessus. Je ne connais pas les arcanes internes de toutes les JVM, mais je doute qu'on puisse gagner grand chose entre les deux écritures citées ci-avant? Si c'est pour gagner 1 nanoseconde sur un traitement de 20 minutes où est l'intérêt ?

    Enfin, il faut penser aussi à la lisibilité du code : si c'est pour gagner 1 ms sur un traitement de 1 minute mais que la maintenance prend 100 fois plus de temps parce que le programme est imbitable et que le moindre truc qu'on change fout en l'air tout le boulot d'optimisation, qu'il faut refaire, on aura perdu beaucoup de temps pour rien.

    Pour en venir à la question plus pragmatique à la fin de ton message, je répondrais donc par une question : est-ce que tu as lancé un profiler sur ton programme, pour identifier les parties à cibler pour une optimisation ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Citation Envoyé par sylvain.bron Voir le message
    proposition 1 : mon nombre (X) != 2
    proposition 2 : mon nombre (X) <= 2
    C'est vrai que comme l'a dit joel ces deux tests ne sont pas équivalentes.

    Perso, je me poserai plus ce genre de question sur des choses genre :

    (X) * 2
    (X) << 1

    Et la réponse serait de faire des milliers (millions ?) de test pour voir s'il y a une diff au niveau du temps... et sur des JVM, vendeurs et plateformes différentes aussi.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

Discussions similaires

  1. Jointure entre tables en source de données/Optimisation d'exécution
    Par JuniorBI dans le forum Développement de jobs
    Réponses: 5
    Dernier message: 27/08/2010, 14h10
  2. Microsoft vise à optimiser l'exécution de PHP
    Par RideKick dans le forum Actualités
    Réponses: 11
    Dernier message: 14/09/2009, 08h10
  3. Optimiser l'exécution d'une liste déroulante
    Par dark_geek dans le forum ASP
    Réponses: 2
    Dernier message: 21/05/2009, 03h09
  4. [JVM]Optimiser la bibliothèque de la JVM ?
    Par Regis.C dans le forum Général Java
    Réponses: 5
    Dernier message: 17/08/2005, 10h54

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