Apakah ada stopwatch di Jawa?

107

Apakah ada stopwatch di Jawa? Di google saya hanya menemukan kode stopwatch yang tidak berfungsi - mereka selalu mengembalikan 0 milidetik.

Kode yang saya temukan ini tidak berfungsi tetapi saya tidak mengerti mengapa.

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;
  }
}
pengguna1007522
sumber
10
Dan bagaimana Anda menentukan bahwa itu tidak berhasil? (mungkin Anda mengukur sesuatu yang membutuhkan waktu lebih sedikit untuk dieksekusi daripada keakuratan System.currentTimeMillis ())
no
5
Silakan posting kode bagaimana Anda menguji kelas ini ...
DXTR66
2
Hanya ingin dicatat bahwa ini adalah salah satu pertanyaan buku teks dalam "Pengantar Pemrograman Java, Versi Lengkap (Edisi ke-9)".
Sam
2
Harap jangan gunakan currentTimeMillis()untuk produksi, karena ini terkait dengan tanggal / waktu sistem dan tidak dijamin monoton (misalnya Anda bisa mendapatkan waktu berlalu yang negatif). Untuk mengukur penggunaan waktu nanoTime()- dijamin monoton dan ditujukan tepat untuk tujuan pengukuran. Lihat docs.oracle.com/javase/8/docs/api/java/lang/…
Nikita Bosik

Jawaban:

90

Gunakan kelas GuavaStopwatch .

Sebuah objek yang mengukur waktu yang telah berlalu dalam nanodetik. Sangat berguna untuk mengukur waktu yang berlalu menggunakan kelas ini daripada panggilan langsung ke System.nanoTime()karena beberapa alasan:

  • Sumber waktu alternatif dapat diganti, untuk alasan pengujian atau kinerja.
  • Seperti yang didokumentasikan oleh nanoTime, nilai yang dikembalikan tidak memiliki arti absolut, dan hanya dapat diinterpretasikan sebagai relatif terhadap stempel waktu lain yang dikembalikan oleh nanoTime pada waktu yang berbeda. Stopwatch adalah abstraksi yang lebih efektif karena hanya memperlihatkan nilai relatif ini, bukan yang absolut.
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"
metode pembantu
sumber
2
stopwatch jambu biji hilang getStartTime(), apache hilang isRunning()ahhhh
Ke Kra
3
@ToKra Apa yang akan Anda lakukan dengan waktu mulai? Karena ini waktu nano, Anda tidak dapat menggunakannya untuk sesuatu yang berarti, seperti yang dijelaskan di dokumen.
Trejkaz
1
Sekarang Anda menggunakan ini untuk mendapatkan milidetik: long stopWatch = stopWatch.elapsed (TimeUnit.MILLISECONDS);
PHPGuru
Versi jambu biji yang mana? Saya menggunakan 1.8 dan tidak menemukan kelas Stopwatch
Laser Infinite
58

Sekarang Anda dapat mencoba sesuatu seperti:

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

Outputnya ada dalam ISO 8601.

Valtoni Boaventura
sumber
1
Cepat dan mudah, terima kasih banyak! Membantu melacak durasi tugas dari awal.
ndm13
Bagaimana jika Anda mengubah waktu sistem selama tidur?
Peteter
1
@ Peteter itu hanya sebuah contoh. Jika Anda menggunakan komputer linux, Anda harus berurusan dengan jam perangkat keras dan jam yang dikelola kernel. Jika Anda mengubah jam perangkat keras, tidak ada yang akan terpengaruh tetapi di jam yang dikelola kernel Anda akan mendapat masalah: Instant.now () mendapatkan waktu sistem dan akan menampilkan interval waktu yang salah.
Valtoni Boaventura
Saya bahkan tidak tahu itu berhasil di Android. Baik untuk mengetahui :)
Valtoni Boaventura
Jangan lupa java.time.Instant tidak dapat diubah dan thread aman :)
Amos Kosgei
38

Musim semi menyediakan org.springframework.util.StopWatchKelas yang elegan (modul inti pegas).

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

Gunakan System.currentTimeMillis()untuk mendapatkan waktu mulai dan waktu akhir dan menghitung perbedaannya.

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

Info selengkapnya ada di tutorial ini

pengguna2374612
sumber
Seperti yang dikatakan di tempat lain, currentTimeMillis () terkait dengan tanggal / waktu sistem dan tidak dijamin monoton (misalnya, Anda bisa mendapatkan waktu berlalu yang negatif).
oligofren
8

Kode tidak berfungsi karena variabel yang sudah berlalu di getElapsedTimeSecs()bukan a floatatau double.

asfer
sumber
7

Tidak ada utilitas Stopwatch bawaan tetapi pada JSR-310 (Java 8 Time) Anda dapat melakukan ini dengan mudah.

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

Saya belum mengukur ini dengan benar tetapi saya kira menggunakan Stopwatch Jambu lebih efektif.

matsa
sumber
3

Sederhana di luar kotak kelas Stopwatch:

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

Pemakaian:

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

gunakan: com.google.common.base.Stopwatch, yang sederhana dan mudah.

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

contoh:

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

"Do something"

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

tugas ini membutuhkan 112 pabrik

Luke_P
sumber
2

coba ini

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();
     }
}
andrewsi
sumber
1
Seperti yang dikatakan di tempat lain, currentTimeMillis () terkait dengan tanggal / waktu sistem dan tidak dijamin monoton (misalnya, Anda bisa mendapatkan waktu berlalu yang negatif).
oligofren
2

Coba ini:

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

}

Menggunakan:

StopWatch sw = new StopWatch();
...
sw.startTiming();
...
String interval = sw.stopTiming();
Oke Uwechue
sumber
2
DateUtils adalah bagian dari Apache Commons, mengapa tidak menggunakan StopWatch saja?
Bill Effin Murray
Dalam kebanyakan kasus, Anda akan menggunakan beberapa perpustakaan umum seperti yang disebutkan dalam jawaban lain (Apache Commons misalnya). Anda bahkan dapat mengambil hanya sebagian dari perpustakaan jika Anda tidak membutuhkan semuanya.
guyarad
2

Coba ini.

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

Pemakaian:

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

Menghibur:

StopWatch: 143 milliseconds.
StopWatch: 0.143 seconds.
KS
sumber
Meskipun ini mungkin atau mungkin bukan yang ditanyakan dalam pertanyaan, jawaban Anda membantu saya mengatasi masalah saya. Terima kasih.
Toiletduck
currentTimeMillis()terkait dengan tanggal / waktu sistem dan tidak dijamin monoton (mis. Anda bisa mendapatkan waktu berlalu yang negatif).
oligofren
Jika Anda memutuskan untuk membangun sendiri, gunakan saja System.nanoTime()untuk selalu mendapatkan hasil yang benar.
oligofren
2

Performetrics menyediakan kelas Stopwatch yang nyaman, seperti yang Anda butuhkan. Itu dapat mengukur waktu jam dinding dan banyak lagi: itu juga mengukur waktu CPU (waktu pengguna dan waktu sistem) jika Anda perlu. Ini kecil, gratis dan Anda dapat mengunduh dari Maven Central. Informasi dan contoh lebih lanjut dapat ditemukan di sini: 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  |
// +-----------------+----------------------+--------------+

Anda dapat mengonversi metrik ke satuan waktu apa pun (nanodetik, milidetik, detik, dll ...)

PS: Saya penulis alat.

Oswaldo Junior
sumber
1

Coba ini.

Solusi Bekerja Sepenuhnya Stopwatch Java

Di sini Anda akan mendapatkan solusi yang berfungsi penuh.

Hanya cuplikan dari solusi yang ditautkan di atas:

Anda dapat membuat kelas seperti kode di bawah ini dan menggunakan metode start dan stop kelas ini sebelum dan setelah bagian kode, Anda ingin mengukur waktu yang dibutuhkan.

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

}

Terima kasih.

Sukriti Sarkar
sumber
1
Meskipun tautan ini mungkin menjawab pertanyaan, lebih baik menyertakan bagian penting dari jawaban di sini dan menyediakan tautan untuk referensi. Jawaban link saja bisa menjadi tidak valid jika halaman tertaut berubah.
SEBAGAI Mackay
Terima kasih @ASMackay atas saran Anda. Saya sepenuhnya setuju dengan Anda.
Sukriti Sarkar