Есть ли секундомер в Java? - PullRequest
94 голосов
/ 24 ноября 2011

Есть ли секундомер в Java?В Google я нахожу только код секундомеров, которые не работают - они всегда возвращают 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;
  }
}

Ответы [ 15 ]

83 голосов
/ 24 ноября 2011

Вы найдете один в

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

Он называется

org.apache.commons.lang.time.StopWatch

Но он примерно так же, как ваш.Если вам нужна более высокая точность, используйте

System.nanoTime()

См. Также этот вопрос здесь:

Затраты времени на измерения в Java

80 голосов
/ 24 ноября 2011

Использование Guava's Stopwatch class .

Объект, который измеряет прошедшее время в наносекундах.Полезно измерять прошедшее время, используя этот класс вместо прямых вызовов System.nanoTime() по нескольким причинам:

  • Альтернативный источник времени может быть заменен, для целей тестирования или производительности.1012 * Как задокументировано 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"
46 голосов
/ 03 ноября 2015

Теперь вы можете попробовать что-то вроде:

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

Вывод в ISO 8601.

33 голосов
/ 06 декабря 2012

Spring обеспечивает элегантный класс org.springframework.util.StopWatch (модуль с пружинным сердечником).

StopWatch stopWatch = new StopWatch();
stopWatch.start();
     // Do something
stopWatch.stop();
     System.out.println(stopWatch.getTotalTimeMillis());
7 голосов
/ 23 августа 2012

Код не работает, потому что истекшая переменная в getElapsedTimeSecs () не является float / double.

5 голосов
/ 09 июля 2015

Нет встроенной утилиты секундомера, но с JSR-310 (Java 8 Time) вы можете сделать это просто.

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

Я не оценил это должным образом, но думаю, что использование секундомера Гуавы более эффективно.

5 голосов
/ 24 мая 2013

Используйте 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);
  }
} 

Подробнее об этом уроке

2 голосов
/ 26 сентября 2017

Использование: 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 мельниц

2 голосов
/ 21 апреля 2016

Простой из коробки Класс секундомера:

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");
2 голосов
/ 21 сентября 2013

попробуйте http://introcs.cs.princeton.edu/java/stdlib/Stopwatch.java.html

это очень просто

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

Этот класс является частью stdlib.jar

...