Temps d'execution en secondes [Résolu]

soheil - 19 avril 2016 à 14:13 - Dernière réponse : KX 15363 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 20 avril 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 

3 réponses

Répondre au sujet
Twinuts 5261 Messages postés dimanche 4 mai 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 19 avril 2016 à 14:45
0
Utile
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 53 Messages postés vendredi 11 mars 2016Date d'inscription 13 mai 2016 Dernière intervention - 19 avril 2016 à 14:48
0
Utile
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 15363 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 19 avril 2016 à 14:53
0
Utile
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.