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 :

Tri, java, et temps d'exécution


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 17
    Points : 16
    Points
    16
    Par défaut Tri, java, et temps d'exécution
    Bonjour,

    j'ai réalisé un tri en java, et je veux étudier les perfomance de ce tri.

    Ainsi je réalise des tests :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for(int i=0;i<10;i++){
    	Tri test=new Tri();
    	dateD=Calendar.getInstance();
    	test.tri3(0,test.taille,2,test.moyenne(0,test.taille-1));
    	dateF=Calendar.getInstance();
    	double temps=dateF.getTimeInMillis()-dateD.getTimeInMillis();
    	System.out.println(temps);		
    }
    En gros ça donne ça, avec différents paramètre de taille de la liste.

    Ce que je ne comprend pas, c'est que les résultats sont les suivants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    3250.0
    766.0
    765.0
    578.0
    578.0
    578.0
    593.0
    578.0
    578.0
    594.0
    Au delà de l'algorithme, est-ce que la machine garde en mémoires certaines choses pour aller plus vite lors d'une nouvelle exécution ?
    J'ai l'impression que mes tests sont indépendants !

    Pour info, je génère à chaque fois une nouvelle liste avec des double aléatoire (du moins j'espère ^^) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public Tri(){
    	Calendar date;
    	Random rand=new Random();
    	liste=new double[taille];
    	for(int i=0;i<taille;i++){
    		date=Calendar.getInstance();
    		rand.setSeed((long)(date.getTimeInMillis()*Math.random()));
    		liste[i]=rand.nextDouble();
    	}
    }
    Quelqu'un a une explication ?

    Merci

  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
    Points : 2 061
    Points
    2 061
    Par défaut
    bonjour,

    il est normal que tu es une différence avec le premier test, car la machine virtuelle charge en mémoire les différentes classes utilisées par ton test.
    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 chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    effet classique des optimisations dynamiques:
    la première exécution est plus lente puis "ça chauffe" et ça s'optimise, ensuite les différences sont normales.
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  4. #4
    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
    Il y a 3 principaux éléments qui peuvent impacter le temps :
    • Le chargement des classes.
      La première fois que tu utilises une classe elle doit être chargé par le classloader.
    • Le Garbage Collector.
      Le GC libère la mémoire par bloc, en bloquant temporairement le programme.
    • La compilation HotSpot.
      La machine virtuelle détecte les parties "chaudes" (les plus utilisés) afin de les recompiler en natif avec plusieurs optimisations.


    Tu peux surveiller tout cela avec les options suivantes de la JVM (pour la JVM de Sun) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -XX:+TraceClassLoading -XX:+PrintGC -XX:+PrintCompilation

    Enfin, il faut noter que la JVM server (option -server) offre généralement une compilation plus poussé que la JVM client (option -client).
    Par défaut le choix entre client/serveur dépend de la version de Java et du système hôte...

    a++

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Il est également possible que le tri soit plus performant sur des valeurs triées, ce qui est toujours le cas après le premier tri... car malheureusement, tu réinitialises les valeurs uniquement dans le constructeur, mais tu n'appelles le constructeur qu'une seule fois.

    L'idéal est d'avoir un tableau auquel tu ne touches pas, et que tu clones avant chaque tri afin d'avoir toujours le même tableau.

  6. #6
    Membre à l'essai
    Inscrit en
    Août 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 17
    Points : 16
    Points
    16
    Par défaut
    Merci pour vos réponses, j'y vois plus claire.

    Par contre, je pense appeler mon constructeur à chaque itération de ma boucle for, donc à chaque fois j'ai des valeurs différentes, nan ?

    Donc si je veux comparer les performances de différents tris, le mieux est de comparer les premiers résultats, ou les derniers ?

Discussions similaires

  1. algorithme de tri et temps d'exécution
    Par khadi8 dans le forum Débuter
    Réponses: 5
    Dernier message: 04/01/2013, 18h41
  2. Réponses: 2
    Dernier message: 13/12/2012, 11h17
  3. optimisation en temps d'exécution d'un tri
    Par Dereck07 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 01/03/2008, 18h49
  4. Affichage du temps d'exécution d'une requête
    Par milka dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 22/03/2004, 17h48
  5. Temps d'exécution des instructions FPU
    Par ubi dans le forum Assembleur
    Réponses: 2
    Dernier message: 24/10/2003, 18h39

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