Java中有秒表吗?

use*_*522 98 java stopwatch

Java中有秒表吗?在谷歌我只找到不起作用的秒表代码 - 它们总是返回0毫秒.

我找到的这段代码不起作用,但我不明白为什么.

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

Luk*_*der 87

你会找到一个

http://commons.apache.org/lang/

它被称为

org.apache.commons.lang.time.StopWatch
Run Code Online (Sandbox Code Playgroud)

但它与你的大致相同.如果您需要更高精度,请使用

System.nanoTime()
Run Code Online (Sandbox Code Playgroud)

另见这个问题:

Java中的时间测量开销


hel*_*hod 82

使用Guava的Stopwatch课程.

测量经过时间的对象,以纳秒为单位.System.nanoTime()由于以下几个原因,使用此类而不是直接调用来测量已用时间非常有用 :

  • 出于测试或性能原因,可以替换备用时间源.
  • 如nanoTime所述,返回的值没有绝对意义,只能解释为相对于nanoTime在不同时间返回的另一个时间戳.秒表是一种更有效的抽象,因为它只暴露这些相对值,而不是绝对值.
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"
Run Code Online (Sandbox Code Playgroud)

  • @ToKra无论如何你会对开始时间做些什么?由于它是纳米时间,因此无论如何都不能将它用于任何有意义的事情,如文档中所述. (3认同)
  • 番石榴秒表缺少`getStartTime()`,apache缺少`isRunning()`ahhhh (2认同)

Val*_*ura 54

现在你可以尝试类似的东西:

Instant starts = Instant.now();
Thread.sleep(10);
Instant ends = Instant.now();
System.out.println(Duration.between(starts, ends));
Run Code Online (Sandbox Code Playgroud)

输出符合ISO 8601标准.

  • 对于 java 8 导入,这只是一个示例,大卫。请在投入生产前进行调整。 (2认同)

Lar*_*sen 35

Spring提供了一个优雅的org.springframework.util.StopWatchClass(s​​pring-core模块).

StopWatch stopWatch = new StopWatch();
stopWatch.start();
     // Do something
stopWatch.stop();
     System.out.println(stopWatch.getTotalTimeMillis());
Run Code Online (Sandbox Code Playgroud)


asf*_*fer 7

代码不起作用,因为getElapsedTimeSecs()中的elapsed变量不是float/double.


use*_*612 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);
  }
} 
Run Code Online (Sandbox Code Playgroud)

本教程的更多信息


mat*_*tsa 5

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

ZonedDateTime now = ZonedDateTime.now();
// Do stuff
long seconds = now.until(ZonedDateTime.now(), ChronoUnit.SECONDS);
Run Code Online (Sandbox Code Playgroud)

我没有正确地对此进行基准测试,但我猜想使用Guava的秒表会更有效.