क्या जावा में एक स्टॉपवॉच है?


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

2
बस यह नोट करना चाहता था कि यह "जावा प्रोग्रामिंग, कॉम्प्रिहेंसिव वर्जन (9 वें संस्करण) का परिचय" में पाठ्यपुस्तक के सवालों में से एक है।
सैम

2
कृपया currentTimeMillis()उत्पादन के लिए उपयोग न करें , क्योंकि यह सिस्टम दिनांक / समय से बंधा है और नीरस होने की गारंटी नहीं है (जैसे कि आप नकारात्मक बीता हुआ समय प्राप्त कर सकते हैं)। समय के उपयोग को मापने के लिए nanoTime()- यह नीरस होने की गारंटी है और वास्तव में उद्देश्य को मापने के लिए है। Docs.oracle.com/javase/8/docs/api/java/lang/…
निकिता बोसिक

जवाबों:


93

तुम एक में मिल जाएगा

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

इसे कहते हैं

org.apache.commons.lang.time.StopWatch

लेकिन यह लगभग आपकी ही तरह करता है। यदि आप अधिक सटीकता के लिए हैं, तो उपयोग करें

System.nanoTime()

इस प्रश्न को यहाँ भी देखें:

जावा में ओवरहेड मापने का समय


90

अमरूद की Stopwatchकक्षा का उपयोग करें ।

एक वस्तु जो नैनोसेकंड में समय को मापती है। System.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()आह्ह्ह
टू क्रै

3
@ToKra वैसे भी शुरुआत के समय में आप क्या करेंगे? चूंकि यह नैनो समय है, आप इसे किसी भी तरह से सार्थक के लिए उपयोग नहीं कर सकते, जैसा कि डॉक्स में वर्णित है।
तर्जुक

1
अब आप मिलिसेकंड प्राप्त करने के लिए इसका उपयोग करते हैं: लंबे स्टॉपवॉच = स्टॉपवॉच.प्लास्ड (TimeUnit.MILLISECONDS);
PHPGuru

कौन सा अमरूद संस्करण है? मैंने 1.8 का उपयोग किया और यह
लेजर अनंत

58

अब आप कुछ इस तरह की कोशिश कर सकते हैं:

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

आउटपुट आईएसओ 8601 में है।


1
त्वरित और आसान, बहुत बहुत धन्यवाद! शुरू से ही कार्य अवधि पर नज़र रखने में मदद करता है।
ndm13

यदि आप नींद के दौरान सिस्टम समय बदलते हैं तो क्या होगा?
पेट्रेटर

1
@Peteter इसका एकमात्र उदाहरण है। यदि आप एक लिनक्स बॉक्स पर हैं, तो आपको हार्डवेयर घड़ी और कर्नेल प्रबंधित घड़ी से निपटना होगा। यदि आप हार्डवेयर घड़ी बदलते हैं, तो कोई भी प्रभावित नहीं होगा लेकिन कर्नेल प्रबंधित घड़ी में आप मुसीबत में होंगे: Instant.now () सिस्टम समय प्राप्त करेगा और एक गलत समय अंतराल दिखाएगा।
वाल्टोनी बोवेन्टुरा

मुझे यह भी नहीं पता था कि यह एंड्रॉइड पर काम करता है। जानकर अच्छा लगा :)
Valtoni Boaventura

Java.time को नहीं भूलना। स्थिर अपरिवर्तनीय है और धागा सुरक्षित है :)
अमोस

38

स्प्रिंग एक सुंदर org.springframework.util.StopWatchवर्ग (स्प्रिंग-कोर मॉड्यूल) प्रदान करता है ।

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 () सिस्टम की तारीख / समय से जुड़ा हुआ है और नीरस होने की गारंटी नहीं है (जैसे आप नकारात्मक बीता हुआ समय प्राप्त कर सकते हैं)।
ऑलिगॉफ्रेन

8

कोड काम नहीं करता है क्योंकि इसमें परिवर्धित चर getElapsedTimeSecs()एक floatया एक नहीं है double


7

स्टॉपवॉच उपयोगिता में निर्मित नहीं है, लेकिन जेएसआर -310 (जावा 8 टाइम) के रूप में आप इसे बस कर सकते हैं।

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

मैंने इसे ठीक से बेंचमार्क नहीं किया है, लेकिन मुझे लगता है कि अमरूद की स्टॉपवॉच का उपयोग करना अधिक प्रभावी होगा।



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 () सिस्टम की तारीख / समय से जुड़ा हुआ है और नीरस होने की गारंटी नहीं है (जैसे आप नकारात्मक बीता हुआ समय प्राप्त कर सकते हैं)।
ऑलिगॉफ्रेन

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 अपाचे कॉमन्स का हिस्सा है, क्यों न सिर्फ अपने स्टॉपवॉच का उपयोग किया जाए?
बिल एफ्फिन मरे

ज्यादातर मामलों में आप कुछ सामान्य लाइब्रेरी का उपयोग करेंगे जैसे कि अन्य उत्तरों में वर्णित है (उदाहरण के लिए अपाचे कॉमन्स)। तुम भी पुस्तकालय के केवल कुछ हिस्सों के साथ ले सकते हैं अगर आप सब कुछ की जरूरत नहीं है।
मसराद

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.

हालांकि यह हो सकता है या नहीं हो सकता है कि सवाल में क्या पूछा जा रहा था, आपके जवाब ने मुझे मेरी समस्या के साथ मदद की। धन्यवाद।
टॉयलेटडॉक

currentTimeMillis()सिस्टम दिनांक / समय से बंधा है और नीरस होने की गारंटी नहीं है (उदाहरण के लिए आप नकारात्मक बीता हुआ समय प्राप्त कर सकते हैं)।
ऑलिगॉफ्रेन

यदि आप अपना खुद का निर्माण करने का निर्णय लेते हैं, तो System.nanoTime()हमेशा सही परिणाम प्राप्त करने के लिए उपयोग करें।
ऑलिगॉफ्रेन

2

Performetrics एक सुविधाजनक स्टॉपवॉच वर्ग प्रदान करता है, जिस तरह से आपको ज़रूरत है। यह दीवार-घड़ी के समय और अधिक को माप सकता है: यह सीपीयू समय (उपयोगकर्ता समय और सिस्टम समय) को मापता है यदि आपको आवश्यकता है। यह छोटा, मुफ्त है और आप मावेन सेंट्रल से डाउनलोड कर सकते हैं। अधिक जानकारी और उदाहरण यहां देखे जा सकते हैं: 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
हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन उत्तर के आवश्यक हिस्सों को यहां शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक-केवल उत्तर अमान्य हो सकते हैं यदि लिंक किए गए पृष्ठ बदल जाते हैं।
एएस मैके 30

आपके सुझाव के लिए धन्यवाद @ASMackay। मैं पूर्णतः सन्तुष्ट हुँ।
सुक्रती सरकार 12
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.