자바에 스톱워치가 있습니까?


107

자바에 스톱워치가 있습니까? 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;
  }
}

10
그리고 그것이 작동하지 않았다는 것을 어떻게 결정합니까? (아마도 System.currentTimeMillis ()의 정확도보다 실행하는 데 더 적은 시간이 걸리는 무언가를 측정하고있을 것입니다.)
nos

5
이 클래스를 테스트하는 방법에 대한 코드를 게시하십시오 ...
DXTR66 2011

2
이것이 "자바 프로그래밍 입문, 종합 버전 (9 판)"의 교과서 질문 중 하나라는 점에 주목하고 싶었습니다.

2
시스템 날짜 / 시간과 연결되어 있고 단조롭지 않을 수도 있으므로 currentTimeMillis()프로덕션에 사용하지 마십시오 (예 : 음의 경과 시간을 얻을 수 있음). 측정 시간 사용 – 단조롭고 정확하게 측정 목적으로 사용됩니다. docs.oracle.com/javase/8/docs/api/java/lang/… 참조nanoTime()
Nikita Bosik

답변:



90

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"

2
구아바 스톱워치가 누락되었습니다 getStartTime(). 아파치가 누락되었습니다. isRunning()ahhhh
To Kra

3
@ToKra 어쨌든 시작 시간으로 무엇을 하시겠습니까? 나노 타임이기 때문에 문서에 설명 된대로 의미있는 어떤 용도로도 사용할 수 없습니다.
Trejkaz

1
이제 이것을 사용하여 밀리 초를 얻습니다. long stopWatch = stopWatch.elapsed (TimeUnit.MILLISECONDS);
PHPGuru

어떤 구아바 버전입니까? 1.8을 사용했는데 Stopwatch 클래스를 찾지 못했습니다
Laser Infinite

58

이제 다음과 같이 시도 할 수 있습니다.

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

출력은 ISO 8601입니다.


1
빠르고 쉽게 감사합니다! 시작부터 작업 기간을 추적하는 데 도움이됩니다.
ndm13

수면 중에 시스템 시간을 변경하면 어떻게됩니까?
Peteter

1
@Peteter는 유일한 예입니다. 리눅스 박스를 사용한다면 하드웨어 클럭과 커널 관리 클럭을 다루어야합니다. 하드웨어 시계를 변경하면 아무 영향도받지 않지만 커널 관리 시계에서는 문제가 발생합니다. Instant.now ()는 시스템 시간을 가져오고 잘못된 시간 간격을 표시합니다.
Valtoni Boaventura

나는 그것이 안드로이드에서 작동하는지조차 몰랐다. 좋은 :) 알고
Valtoni Boaventura

java.time.Instant를 잊지 않는 것은 :) 불변이며, 스레드 안전
아모스 코스 게이

38

Spring은 우아한 org.springframework.util.StopWatch클래스 (spring-core 모듈)를 제공합니다.

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

8

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

이 튜토리얼의 추가 정보


다른 곳에서 언급했듯이 currentTimeMillis ()는 시스템 날짜 / 시간과 연결되어 있으며 단조 롭다고 보장 할 수 없습니다 (예 : 음의 경과 시간을 얻을 수 있음).
oligofren

8

의 경과 변수가 있기 때문에 코드는 작동하지 않습니다 getElapsedTimeSecs()하지 않는 것입니다 floatdouble.


7

내장 된 Stopwatch 유틸리티는 없지만 JSR-310 (Java 8 Time)에서는 간단하게 수행 할 수 있습니다.

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

나는 이것을 제대로 벤치마킹하지 않았지만 Guava의 스톱워치를 사용하는 것이 더 효과적이라고 생각합니다.



3

즉시 사용 가능한 간단한 스톱워치 클래스 :

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

3

사용 : 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

이 시도

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

1
다른 곳에서 언급했듯이 currentTimeMillis ()는 시스템 날짜 / 시간과 연결되어 있으며 단조 롭다고 보장 할 수 없습니다 (예 : 음의 경과 시간을 얻을 수 있음).
oligofren

2

이 시도:

/*
 * 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를 사용하지 않는 이유는 무엇입니까?
Bill Effin Murray 2014

대부분의 경우 다른 답변 (예 : Apache Commons)에서 언급 한 것과 같은 공통 라이브러리를 사용합니다. 모든 것이 필요하지 않은 경우 라이브러리의 일부만 가져올 수도 있습니다.
guyarad

2

이 시도.

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.

이것이 질문에서 요청한 것일 수도 있고 아닐 수도 있지만 귀하의 답변은 제 문제에 도움이되었습니다. 감사합니다.
Toiletduck

currentTimeMillis()시스템 날짜 / 시간과 연결되어 있으며 단조 롭다고 보장 할 수 없습니다 (예 : 음의 경과 시간을 얻을 수 있음).
oligofren

직접 제작하기로 결정한 경우 System.nanoTime()항상 올바른 결과를 얻기 위해 사용하십시오.
oligofren

2

Performetrics 는 필요한 방식으로 편리한 스톱워치 클래스를 제공합니다. 벽시계 시간 등을 측정 할 수 있습니다. 필요한 경우 CPU 시간 (사용자 시간 및 시스템 시간)도 측정합니다. 작고 무료이며 Maven Central에서 다운로드 할 수 있습니다. 더 많은 정보와 예제는 여기에서 찾을 수 있습니다 : https://obvj.net/performetrics

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

// Your code

sw.stop();
sw.printStatistics(System.out);

// Sample output:
// +-----------------+----------------------+--------------+
// | Counter         |         Elapsed time | Time unit    |
// +-----------------+----------------------+--------------+
// | Wall clock time |             85605718 | nanoseconds  |
// | CPU time        |             78000500 | nanoseconds  |
// | User time       |             62400400 | nanoseconds  |
// | System time     |             15600100 | nanoseconds  |
// +-----------------+----------------------+--------------+

메트릭을 모든 시간 단위 (나노초, 밀리 초, 초 등)로 변환 할 수 있습니다.

추신 : 저는이 도구의 작성자입니다.



1

이 시도.

자바 스톱워치 완전 작동 솔루션

여기에서 완전히 작동하는 솔루션을 얻을 수 있습니다.

위에 링크 된 솔루션의 일부 :

아래 코드와 같은 클래스를 생성하고이 클래스의 시작 및 중지 방법을 코드 섹션 전후에 사용하여 소요 시간을 측정 할 수 있습니다.

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

}

감사합니다.


1
이 링크가 질문에 답할 수 있지만 여기에 답변의 필수 부분을 포함하고 참조 용 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 무효화 될 수 있습니다.
AS Mackay

귀하의 제안에 대해 @ASMackay에게 감사드립니다. 나는 당신에게 전적으로 동의합니다.
Sukriti Sarkar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.