web-dev-qa-db-fra.com

Existe-t-il un chronomètre en Java?

Existe-t-il un chronomètre en Java? Sur Google, je ne trouve que le code des chronomètres qui ne fonctionnent pas - ils renvoient toujours 0 milliseconde.

Ce code que j'ai trouvé ne fonctionne pas mais je ne vois pas pourquoi.

public class StopWatch {

  private long startTime = 0;
  private long stopTime = 0;
  private boolean running = false;


  public void start() {
    this.startTime = System.currentTimeMillis();
    this.running = true;
  }


  public void stop() {
    this.stopTime = System.currentTimeMillis();
    this.running = false;
  }


  //elaspsed time in milliseconds
  public long getElapsedTime() {
    long elapsed;
    if (running) {
      elapsed = (System.currentTimeMillis() - startTime);
    } else {
      elapsed = (stopTime - startTime);
    }
    return elapsed;
  }


  //elaspsed time in seconds
  public long getElapsedTimeSecs() {
    long elapsed;
    if (running) {
      elapsed = ((System.currentTimeMillis() - startTime) / 1000);
    } else {
      elapsed = ((stopTime - startTime) / 1000);
    }
    return elapsed;
  }
}
86
user1007522

Vous en trouverez un dans

http://commons.Apache.org/lang/

C'est appelé

org.Apache.commons.lang.time.StopWatch

Mais cela fait à peu près la même chose que le vôtre. Si vous voulez plus de précision, utilisez

System.nanoTime()

Voir aussi cette question ici:

Temps de mesure du temps système en Java

79
Lukas Eder

Utilisez La classe Stopwatch de Goyave .

Un objet qui mesure le temps écoulé en nanosecondes. C'est utile pour mesurer le temps écoulé en utilisant cette classe au lieu d'appels directs à System.nanoTime() pour plusieurs raisons:

  • Une autre source de temps peut être substituée, pour des raisons de test ou de performance.
  • Comme indiqué par nanoTime, la valeur renvoyée n'a pas de signification absolue et ne peut être interprétée que comme relative à un autre horodatage retourné par nanoTime à une heure différente. Chronomètre est un plus abstraction efficace car elle n’expose que ces valeurs relatives, pas les absolus.
Stopwatch stopwatch = Stopwatch.createStarted();
doSomething();
stopwatch.stop(); // optional

long millis = stopWatch.elapsed(TimeUnit.MILLISECONDS);

log.info("that took: " + stopwatch); // formatted string like "12.3 ms"
75
helpermethod

Maintenant, vous pouvez essayer quelque chose comme:

Instant starts = Instant.now();
Thread.sleep(10);
Instant ends = Instant.now();
System.out.println(Duration.between(starts, ends));

La sortie est en ISO 8601.

38

Spring fournit une classe org.springframework.util.StopWatch élégante (module Spring-Core).

StopWatch stopWatch = new StopWatch();
stopWatch.start();
     // Do something
stopWatch.stop();
     System.out.println(stopWatch.getTotalTimeMillis());
28
Larsen

Le code ne fonctionne pas car la variable écoulée dans getElapsedTimeSecs () n'est pas un float/double.

7
asfer

Utilisez System.currentTimeMillis() pour obtenir l'heure de début et l'heure de fin et calculez la différence.

class TimeTest1 {
  public static void main(String[] args) {

    long startTime = System.currentTimeMillis();

    long total = 0;
    for (int i = 0; i < 10000000; i++) {
      total += i;
    }

    long stopTime = System.currentTimeMillis();
    long elapsedTime = stopTime - startTime;
    System.out.println(elapsedTime);
  }
} 

Plus d'infos sur ce tutoriel

6
user2374612

Il n’existe aucun utilitaire Chronomètre intégré, mais à partir de JSR-310 (Java 8 Time), vous pouvez le faire simplement.

ZonedDateTime now = ZonedDateTime.now();
// Do stuff
long seconds = now.until(ZonedDateTime.now(), ChronoUnit.SECONDS);

Je n'ai pas mesuré cela correctement, mais j'imagine que l'utilisation du chronomètre de Guava est plus efficace.

5
matsa

Essaye ça.

public class StopWatch { 

      private long startTime = 0;
      private long stopTime = 0;

      public StopWatch()
      {
            startTime = System.currentTimeMillis();
      }

      public void start() {
        startTime = System.currentTimeMillis();
      }

      public void stop() {
        stopTime = System.currentTimeMillis();
        System.out.println("StopWatch: " + getElapsedTime() + " milliseconds.");
        System.out.println("StopWatch: " + getElapsedTimeSecs() + " seconds.");
      }

      /**
       * @param process_name
       */
      public void stop(String process_name) {
            stopTime = System.currentTimeMillis();
            System.out.println(process_name + " StopWatch: " + getElapsedTime() + " milliseconds.");
            System.out.println(process_name + " StopWatch: " + getElapsedTimeSecs() + " seconds.");
      }      

      //elaspsed time in milliseconds
      public long getElapsedTime() {
          return stopTime - startTime;
      }

      //elaspsed time in seconds
      public double getElapsedTimeSecs() {
        double elapsed;
          elapsed = ((double)(stopTime - startTime)) / 1000;
        return elapsed;
      }
} 

Usage:

StopWatch watch = new StopWatch();
// do something
watch.stop();

Console:

StopWatch: 143 milliseconds.
StopWatch: 0.143 seconds.
2
K.S

Classe Stopwatch simple et prête à l'emploi:

import Java.time.Duration;
import Java.time.Instant;

public class StopWatch {

    Instant startTime, endTime;
    Duration duration;
    boolean isRunning = false;

    public void start() {
        if (isRunning) {
            throw new RuntimeException("Stopwatch is already running.");
        }
        this.isRunning = true;
        startTime = Instant.now();
    }

    public Duration stop() {
        this.endTime = Instant.now();
        if (!isRunning) {
            throw new RuntimeException("Stopwatch has not been started yet");
        }
        isRunning = false;
        Duration result = Duration.between(startTime, endTime);
        if (this.duration == null) {
            this.duration = result;
        } else {
            this.duration = duration.plus(result);
        }

        return this.getElapsedTime();
    }

    public Duration getElapsedTime() {
        return this.duration;
    }

    public void reset() {
        if (this.isRunning) {
            this.stop();
        }
        this.duration = null;
    }
}

Usage:

StopWatch sw = new StopWatch();
sw.start();
    // doWork()
sw.stop();
System.out.println( sw.getElapsedTime().toMillis() + "ms");
2
Jonas_Hess

essaye ça

import Java.awt.event.*;

import Java.awt.*;

import javax.swing.*;

public class millis extends JFrame implements ActionListener, Runnable
    {

     private long startTime;
     private final static Java.text.SimpleDateFormat timerFormat = new Java.text.SimpleDateFormat("mm : ss.SSS");
     private final JButton startStopButton= new JButton("Start/stop");
     private Thread updater;
     private boolean isRunning= false;
     private final Runnable displayUpdater= new Runnable()
         {
         public void run()
             {
             displayElapsedTime(System.currentTimeMillis() - millis.this.startTime);
         }
     };
     public void actionPerformed(ActionEvent ae)
         {
         if(isRunning)
             {
             long elapsed= System.currentTimeMillis() - startTime;
             isRunning= false;
             try
                 {
                 updater.join();
                 // Wait for updater to finish
             }
             catch(InterruptedException ie) {}
             displayElapsedTime(elapsed);
             // Display the end-result
         }
         else
             {
             startTime= System.currentTimeMillis();
             isRunning= true;
             updater= new Thread(this);
             updater.start();
         }
     }
     private void displayElapsedTime(long elapsedTime)
         {
         startStopButton.setText(timerFormat.format(new Java.util.Date(elapsedTime)));
     }
     public void run()
         {
         try
             {
             while(isRunning)
                 {
                 SwingUtilities.invokeAndWait(displayUpdater);
                 Thread.sleep(50);
             }
         }
         catch(Java.lang.reflect.InvocationTargetException ite)
             {
             ite.printStackTrace(System.err);
             // Should never happen!
         }
         catch(InterruptedException ie) {}
         // Ignore and return!
     }
     public millis()
         {
         startStopButton.addActionListener(this);
         getContentPane().add(startStopButton);
         setSize(100,50);
         setVisible(true);
     }
     public static void main(String[] arg)
         {
         new Stopwatch().addWindowListener(new WindowAdapter()
             {
             public void windowClosing(WindowEvent e)
                 {
                 System.exit(0);
             }
         });
         millis s=new millis();
         s.run();
     }
}
2
user1806722

essayez ceci http://introcs.cs.princeton.edu/Java/stdlib/Stopwatch.Java.html

c'est très facile

Stopwatch st = new Stopwatch();
// Do smth. here
double time = st.elapsedTime(); // the result in millis

Cette classe fait partie de stdlib.jar

2
john

Essaye ça:

/*
 * calculates elapsed time in the form hrs:mins:secs
 */
public class StopWatch
{ 
    private Date startTime;

    public void startTiming()
    {
        startTime = new Date();
    }

    public String stopTiming()
    {
        Date stopTime = new Date();
        long timediff = (stopTime.getTime() - startTime.getTime())/1000L;
        return(DateUtils.formatElapsedTime(timediff));
    }

}

Utilisation:

StopWatch sw = new StopWatch();
...
sw.startTiming();
...
String interval = sw.stopTiming();
1
Oke Uwechue

utilisateur1007522, je ne sais pas pourquoi votre code ne fonctionne pas (je dirais que asfer a déjà commenté cela), mais je viens d'avoir le même problème pour obtenir 0 millisecondes de com.google.common.base.Stopwatch.

Je faisais 

Stopwatch stopwatch = new Stopwatch();
doSomething();
logger.info("test took:" + stopwatch);

Maintenant je fais

Stopwatch stopwatch = new Stopwatch().start();
doSomething();
stopwatch.stop();
logger.info("test took:" + stopwatch);

et ça marche, je me fais "test pris: 26.81 s"

0
kckdqj

Essaye ça.

solution Java Chronomètre fonctionnant pleinement

Ici, vous obtiendrez une solution pleinement opérationnelle.

Juste un extrait de la solution ci-dessus:

Vous pouvez créer une classe comme ci-dessous code et utiliser la méthode de démarrage et d'arrêt de cette classe avant et après la section de code, vous souhaitez mesurer le temps pris.

public class Stopwatch{
  private long startTime;
  private long stopTime;

  /**
   starting the stop watch.
  */
  public void start(){
        startTime = System.nanoTime();
  }

  /**
   stopping the stop watch.
  */
  public void stop()
  {     stopTime = System.nanoTime(); }

  /**
  elapsed time in nanoseconds.
  */
  public long time(){
        return (stopTime - startTime);
  }

  public String toString(){
      return "elapsed time: " + time() + " nanoseconds.";
  }

}

Je vous remercie.

0
Sukriti Sarkar

utilisez: com.google.common.base.Stopwatch, c'est simple et facile. 

<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>23.0</version>
</dependency>

exemple: 

Stopwatch stopwatch = new Stopwatch();
stopwatch.start();

"Do something"

logger.debug("this task took " + stopwatch.stop().elapsedTime(TimeUnit.MILLISECONDS) + " mills");

cette tâche a pris 112 moulins 

0
Luke_P

Vous pouvez en trouver un pratique ici: 

https://github.com/varra4u/utils4j/blob/master/src/main/Java/com/varra/util/StopWatch.Java

Usage: 

final StopWatch timer = new StopWatch();
System.out.println("Timer: " + timer);
System.out.println("ElapsedTime: " + timer.getElapsedTime());
0
varra