2011-11-24 87 views
74

C'è un cronometro in Java? Perché su google trovo solo codici di cronometri e non funzionano, mi danno sempre 0 millisecondi.C'è un cronometro in Java?

Questo codice che ho trovato non funziona, ma non vedo il motivo per cui perché il codice guarda bene a me.

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; 
    } 
} 
+10

E come si fa a determin non ha funzionato? (forse stai misurando qualcosa che richiede meno tempo per l'esecuzione rispetto alla precisione di System.currentTimeMillis()) – nos

+5

Inserisci il codice come stai testando questa classe ... – DXTR66

+1

Volevo solo sottolineare che questa è una delle domande da manuale in "Introduzione alla programmazione Java, versione completa (9a edizione)". – Sam

risposta

66

Usa Guava's Stopwatch class.

Un oggetto che misura il tempo trascorso in nanosecondi. È utile misura il tempo trascorso utilizzando questa classe invece di chiamate dirette a System.nanoTime() per alcune ragioni:

  • un'origine ora alternativa può essere sostituito, per motivi di test o di prestazioni.
  • Come documentato dal nanoTime, il valore restituito ha alcun significato assoluto, e può essere interpretata soltanto rispetto ad un'altra timestamp restituito da nanoTime in un momento diverso. Cronometro è più astrazione efficace perché espone solo questi valori relativi, non quelli assoluti.
Stopwatch stopwatch = Stopwatch.createStarted(); 
doSomething(); 
stopwatch.stop(); // optional 

long millis = stopwatch.elapsedMillis(); 

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

cronometro guava manca 'getStartTime()', manca l'apache 'isRunning()' ahhhh –

+2

@ToKra Cosa faresti comunque con l'ora di inizio? Dal momento che è nano il tempo, non è possibile utilizzarlo comunque per qualcosa di significativo, come descritto nei documenti. – Trejkaz

6

Il codice non funziona a causa variabile trascorso in getElapsedTimeSecs() non è un float/double.

2

provare questo

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(); 
    } 
} 
22

Primavera offre un elegante Classe cronometro.

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

Utilizzare System.currentTimeMillis() per ottenere l'ora di inizio e l'ora di fine e calcolare la differenza.

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); 
    } 
} 

More info at this tutorial

0

user1007522, non so perché il tuo codice non funziona (sembra che questo sia già stato commentato), ma ho avuto lo stesso problema con l'ottenimento di 0 millisecondi da com.google.common.base.Stopwatch .

stavo facendo

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

Ora sto facendo

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

e funziona, ottengo "test ha preso: 26.81 s"

1

Prova questa:

/* 
* 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)); 
    } 

} 

Uso:

StopWatch sw = new StopWatch(); 
... 
sw.startTiming(); 
... 
String interval = sw.stopTiming(); 
+2

DateUtils fa parte di Apache Commons, perché non usare semplicemente il loro StopWatch? –

+0

Nella maggior parte dei casi userai alcune librerie comuni come menzionate in altre risposte (Apache Commons per esempio). Puoi anche prendere solo parti della biblioteca con se non hai bisogno di tutto. – guyarad

4

Non esiste un'utilità di cronometro incorporata, ma a partire da JSR-310 (Java 8 Time) è possibile farlo semplicemente.

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

Non ho eseguito il benchmark correttamente, ma suppongo che l'uso del cronometro di Guava sia più efficace.

25

Ora si può provare qualcosa di simile:

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

uscita è in ISO 8601.

+1

Veloce e facile, grazie mille! Aiuta a tenere traccia della durata dell'attività dall'inizio. – ndm13

2

Semplice fuori della classe scatola cronometro:

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"); 
0

Prova questo.

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. 
0

uso: com.google.common.base.Stopwatch, la sua semplice e facile.

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

esempio:

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

"Do something" 

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

questo compito ha avuto 112 mulini

Problemi correlati