Java'da kronometre var mı?


107

Java'da kronometre var mı? Google'da yalnızca çalışmayan kronometrelerin kodunu buluyorum - her zaman 0 milisaniye döndürüyorlar.

Bulduğum bu kod çalışmıyor ama nedenini anlamıyorum.

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
Ve işe yaramadığını nasıl anlarsınız? (belki de yürütmesi System.currentTimeMillis () 'in doğruluğundan daha az zaman alan bir şeyi ölçüyorsunuz)
hayır

5
Lütfen kodu bu sınıfı nasıl test ettiğinizi yazın ...
DXTR66

2
Bunun "Java Programlamaya Giriş, Kapsamlı Sürüm (9. Baskı)" ders kitabındaki sorulardan biri olduğunu belirtmek isterim.
Sam

2
Sistem tarihi / saatine bağlı olduğundan ve monoton olması garanti edilmediğinden lütfen currentTimeMillis()üretim için kullanmayın (örneğin negatif geçen süre alabilirsiniz). Zaman kullanımını ölçmek için - monoton olması garanti edilir ve tam olarak ölçüm amacına yöneliktir. Docs.oracle.com/javase/8/docs/api/java/lang/… sayfasına bakınnanoTime()
Nikita Bosik

Yanıtlar:



90

Guava'nın Stopwatchsınıfını kullanın .

Nanosaniye cinsinden geçen zamanı ölçen bir nesne. System.nanoTime()Birkaç nedenden dolayı doğrudan çağrı yapmak yerine bu sınıfı kullanarak geçen zamanı ölçmek faydalıdır :

  • Test veya performans nedenleriyle alternatif bir zaman kaynağı değiştirilebilir.
  • NanoTime tarafından belgelendiği gibi, döndürülen değerin mutlak bir anlamı yoktur ve yalnızca nanoTime tarafından farklı bir zamanda döndürülen başka bir zaman damgasına göre yorumlanabilir. Kronometre daha etkili bir soyutlamadır çünkü mutlak değerleri değil, yalnızca bu göreli değerleri ortaya çıkarır.
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
guavas kronometre eksik getStartTime(), apache eksik isRunning()ahhhh
To Kra

3
@ToKra Yine de başlangıç ​​saatiyle ne yapardınız? Nano zamanı olduğu için, belgelerde açıklandığı gibi yine de anlamlı bir şey için kullanamazsınız.
Trejkaz

1
Şimdi milisaniyeleri almak için bunu kullanacaksınız: long stopWatch = stopWatch.elapsed (TimeUnit.MILLISECONDS);
PHPGuru

Hangi guava versiyonu bu? 1.8 kullandım ve Kronometre sınıfını bulamadı
Laser Infinite

58

Şimdi şöyle bir şey deneyebilirsiniz:

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

Çıktı ISO 8601'de.


1
Hızlı ve kolay, çok teşekkür ederim! Başlangıçtan itibaren görev süresinin izlenmesine yardımcı olur.
ndm13

Ya uyku sırasında sistem saatini değiştirirseniz?
Peteter

1
@Peteter bunun tek bir örneği. Bir linux kutusundaysanız, donanım saati ve çekirdek tarafından yönetilen saatle uğraşmanız gerekir. Donanım saatini değiştirirseniz, hiçbiri etkilenmez, ancak çekirdek tarafından yönetilen saatte sorun yaşarsınız: Instant.now () sistem saatini alır ve yanlış bir zaman aralığı gösterir.
Valtoni Boaventura

Android'de çalıştığını bile bilmiyordum. Bilmekte
fayda var

Java.time.Instant değişmez ve iş parçacığı için güvenlidir :)
Amos Kosgei

38

Yay, zarif bir org.springframework.util.StopWatchSınıf (yay-çekirdekli modül) sağlar.

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

8

Kullanım System.currentTimeMillis()başlangıç ve bitiş zamanını almak ve farkı hesaplamak için.

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

Bu eğiticide daha fazla bilgi


Başka bir yerde söylendiği gibi, currentTimeMillis () sistem tarih / saatine bağlıdır ve tekdüze olması garanti edilmez (örneğin negatif geçen süre elde edebilirsiniz).
oligofren

8

Kod çalışmıyor çünkü in geçen değişken getElapsedTimeSecs()a floatveya değil double.


7

Dahili Kronometre yardımcı programı yoktur, ancak JSR-310 (Java 8 Time) itibariyle bunu kolayca yapabilirsiniz.

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

Bunu doğru bir şekilde karşılaştırmadım ancak Guava'nın Kronometresini kullanmanın daha etkili olduğunu tahmin ediyorum.



3

Kutudan çıkar çıkmaz basit Kronometre sınıfı:

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

Kullanım:

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

3

kullanın: com.google.common.base.Stopwatch, basit ve kolaydır.

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

misal:

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

"Do something"

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

bu görev 112 değirmen aldı


2

bunu dene

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
Başka bir yerde söylendiği gibi, currentTimeMillis () sistem tarih / saatine bağlıdır ve tekdüze olması garanti edilmez (örneğin negatif geçen süre elde edebilirsiniz).
oligofren

2

Bunu dene:

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

}

Kullanım:

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

2
DateUtils, Apache Commons'ın bir parçasıdır, neden sadece StopWatch'larını kullanmıyorsunuz?
Bill Effin Murray

Çoğu durumda, diğer yanıtlarda belirtildiği gibi bazı ortak kitaplıkları kullanırsınız (örneğin Apache Commons). Her şeye ihtiyacınız yoksa, kütüphanenin sadece bölümlerini bile alabilirsiniz.
guyarad

2

Bunu dene.

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

Kullanım:

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

Konsol:

StopWatch: 143 milliseconds.
StopWatch: 0.143 seconds.

Soruda sorulan şey bu olsa da olmasa da, cevabınız sorunumda bana yardımcı oldu. Teşekkür ederim.
Toiletduck

currentTimeMillis()sistem tarih / saatine bağlıdır ve tekdüze olması garanti edilmez (örneğin negatif geçen süre elde edebilirsiniz).
oligofren

Kendinizinkini oluşturmaya karar verirseniz, System.nanoTime()her zaman doğru sonuçları almak için kullanın .
oligofren

2

Performetrics , tam da ihtiyacınız olan şekilde uygun bir Kronometre sınıfı sağlar. Duvar saati süresini ve daha fazlasını ölçebilir: İhtiyaç duyduğunuzda CPU süresini (kullanıcı zamanı ve sistem zamanı) da ölçer. Küçük, ücretsizdir ve Maven Central'dan indirebilirsiniz. Daha fazla bilgi ve örnek burada bulunabilir: 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  |
// +-----------------+----------------------+--------------+

Ölçüleri herhangi bir zaman birimine (nanosaniye, milisaniye, saniye, vb.) Dönüştürebilirsiniz.

Not: Aracın yazarıyım.



1

Bunu dene.

Java Kronometre Tam Çalışan Çözüm

Burada tamamen çalışan bir çözüm elde edeceksiniz.

Yukarıda bağlantılı çözümden sadece bir pasaj:

Aşağıdaki kod gibi bir sınıf oluşturabilir ve bu sınıfın start ve stop yöntemini kod bölümünden önce ve sonra kullanabilir, geçen zamanı ölçmek istiyorsunuz.

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

}

Teşekkür ederim.


1
Bu bağlantı soruyu cevaplayabilirken, cevabın temel kısımlarını buraya eklemek ve referans için bağlantıyı sağlamak daha iyidir. Bağlantılı sayfa değişirse, yalnızca bağlantı yanıtları geçersiz hale gelebilir.
AS Mackay

Öneriniz için @ ASMackay'e teşekkürler. Sana tamamen katılıyorum.
Şükriti Şarkar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.