Temps d'execution en secondes [Résolu]

soheil - 19 avril 2016 à 14:13 - Dernière réponse : KX 15784 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 20 octobre 2018 Dernière intervention
- 19 avril 2016 à 14:53
Bonjour,

je souhaite calculer le temps d'execution d'une methode "executeAlgo()" j'ai utilisé alors :

if(e.getSource() == execute) {
long tempsDebut = System.currentTimeMillis();
executeAlgo();


long tempsFin = System.currentTimeMillis();
float seconds = (tempsFin - tempsDebut) / 1000F;

System.out.println("Opération effectuée en: "+ Float.toString(seconds) + " secondes.");

mais il me donne que maximum 3 chiffres apres la virgule et des fois c'est carrement 0.0 ??!!??
Afficher la suite 

Votre réponse

3 réponses

Twinuts 5282 Messages postés dimanche 4 mai 2003Date d'inscriptionModérateurStatut 19 octobre 2018 Dernière intervention - 19 avril 2016 à 14:45
0
Merci
Salut,

Si tu veux une plus grande précision il faut utiliser un double et non un float.

Pour ce qui est du 0 sec... ça dépend de ce que fait ta méthode (qui peut n'être quantifiable qu'en nano)
import java.util.Random;


public class Time {
  
  private static void executeAlgo15() throws InterruptedException{
    Thread.sleep(1500);
  }
  private static void executeAlgoRand() throws InterruptedException {
    Thread.sleep(new Random().nextInt(1000));
  }
  private static void executeAlgoFast() { }

  public static void main(String[] args) throws InterruptedException {
    long tempsDebut, tempsFin;
    double seconds;
    
    /* test à 1.5 sec */
    tempsDebut = System.currentTimeMillis();
    executeAlgo15();
    tempsFin = System.currentTimeMillis();
    seconds = (tempsFin - tempsDebut) / 1000F;
    System.out.println("Opération effectuée en: "+ Double.toString(seconds) + " secondes.");

    /* test rand avec un max de 1 sec */
    tempsDebut = System.currentTimeMillis();
    executeAlgoRand();
    tempsFin = System.currentTimeMillis();
    seconds = (tempsFin - tempsDebut) / 1000F;
    System.out.println("Opération effectuée en: "+ Double.toString(seconds) + " secondes.");
    
    /* test rapide en ms toujours à 0 */
    tempsDebut = System.currentTimeMillis();
    executeAlgoFast();
    tempsFin = System.currentTimeMillis();
    seconds = (tempsFin - tempsDebut) / 1000F;
    System.out.println("Opération effectuée en: "+ Double.toString(seconds) + " secondes.");
    
    /* meme test mais en nano */
    tempsDebut = System.nanoTime();
    executeAlgoFast();
    tempsFin = System.nanoTime();
    seconds = (tempsFin - tempsDebut) / 1000000F;
    System.out.println("Opération effectuée en: "+ Double.toString(seconds) + " secondes.");
  }
}

Commenter la réponse de Twinuts
choukie12 55 Messages postés vendredi 11 mars 2016Date d'inscription 27 juin 2018 Dernière intervention - 19 avril 2016 à 14:48
0
Merci
Hello,

essaie plutôt de faire ceci :


long duration = (tempsFin - tempsDebut);  
System.out.format("Millisecondes= %s, ( S_Start : %s, S_End : %s ) \n", duration, startTime, endTime );
System.out.println("date format : "+millisToShortDHMS( duration ) );
Commenter la réponse de choukie12
KX 15784 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 20 octobre 2018 Dernière intervention - 19 avril 2016 à 14:53
0
Merci
Bonjour,

"il me donne que maximum 3 chiffres apres la virgule"
C'est normal... Tu divises un entier par 1000 !

Exemple : t = 123456789 ms, t/1000=123456.789 s

Si tu veux plus de précision il faudrait calculer ta différence non pas en millisecondes mais en nanosecondes. Et pour conserver la précision ce n'est pas float que tu dois utiliser mais double.

long tempsDebut = System.nanoTime(); 
executeAlgo();
long tempsFin = System.nanoTime(); 
double seconds = (tempsFin - tempsDebut) / 1e9; 
System.out.println("Opération effectuée en: "+ seconds + " secondes.");

Remarque : c'est une mauvaise idée de faire ton action dans le même thread que la gestion de ton événement, si ton action venait à durer longtemps, ou pire à provoquer une exception, l'interface graphique pourrait freezer. Il faudrait que tu utilises un thread dédié, les SwingWorker sont fait pour ça.
Commenter la réponse de KX

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.