2011-11-24 51 views
74

在Java中是否有秒表?因为在谷歌我只能找到秒表的代码,他们不工作,他们总是给我0毫秒。Java中是否有秒表?

我发现这段代码不起作用,但我不明白为什么,因为代码对我来说看起来很好。

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

那你怎么determin它没有工作? (也许你正在测量的东西比System.currentTimeMillis()的精确度要花费更少的时间来执行) – nos

+5

请发布代码如何测试这个类... – DXTR66

+1

只是想说明这是“Java编程简介,综合版(第9版)”中的教科书问题之一。 – Sam

回答

66

使用Guava's Stopwatch class

一个对象,用于测量经过的时间(以纳秒为单位)。它使用这个类代替直接调用来 System.nanoTime()的几个原因是 测量经过时间有用:

  • 的备用时间源可以被取代,用于测试或性能原因。
  • 如nanoTime所记录,返回的值没有绝对含义,只能解释为相对于由nanoTime在不同时间返回的另一个时间戳 。秒表是一个更有效的抽象,因为它只公开了这些相对值,而不是绝对值。
Stopwatch stopwatch = Stopwatch.createStarted(); 
doSomething(); 
stopwatch.stop(); // optional 

long millis = stopwatch.elapsedMillis(); 

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

番石榴秒表缺少'getStartTime()',缺少apache'isRunning()'ahhhh –

+2

@ ToKra无论如何,你会如何处理开始时间?由于这是纳秒时间,因此无论如何都不能将其用于任何有意义的事情,正如文档中所述。 – Trejkaz

6

代码不工作,因为在getElapsedTimeSecs()经过变量不是浮动/双。

2

试试这个

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

Spring提供了一个优雅的秒表类。

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

使用System.currentTimeMillis()获取开始时间和结束时间并计算差异。

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,我不知道为什么你的代码不起作用(看起来像asfer已经评论过),但我刚刚从com.google.common.base.Stopwatch获得0毫秒的问题。

我是做

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

我现在做

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

和它的作品,我得到 “测试了:26.81的”

1

试试这个:

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

} 

用途:

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

DateUtils是Apache Commons的一部分,为什么不使用他们的StopWatch? –

+0

在大多数情况下,您会使用其他答案中提到的一些常见库(例如Apache Commons)。如果你不需要任何东西,你甚至可以只带图书馆的一部分。 – guyarad

4

没有内置Stopwatch实用程序,但从JSR-310(Java 8 Time)开始,您可以简单地执行此操作。

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

我还没有正确的基准,但我猜想使用番石榴的秒表更有效。

25

现在,你可以尝试这样的:

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

输出是在ISO 8601

+1

快速简单,非常感谢!帮助跟踪任务开始时间。 – ndm13

2

简单的开箱即用秒表类:

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

用法:

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

试试这个。

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

用法:

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

控制台:

StopWatch: 143 milliseconds. 
StopWatch: 0.143 seconds. 
0

使用:com.google.common.base.Stopwatch,它的简单和容易。

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

例如:

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

"Do something" 

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

这个任务花了112个厂