Czy w Javie jest stoper?


Czy w Javie jest stoper? W Google znajduję tylko kod do stoperów, które nie działają - zawsze zwracają 0 milisekund.
Ten kod, który znalazłem, nie działa, ale nie rozumiem dlaczego.
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;
}
}

Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jeden z nich znajdziesz pod adresem
http://commons.apache.org/lang
http://commons.apache.org/lang/
/
To się nazywa
org.apache.commons.lang.time.StopWatch

Ale robi mniej więcej to samo, co twoje. Jeśli potrzebujesz większej precyzji, użyj
System.nanoTime()

Zobacz także to pytanie tutaj:
Czas zmierzyć narzut w Javie
https://coderoad.ru/5640409/
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Posługiwać się

klasa guava
Stoper
https://google.github.io/guava ... .html
.

Obiekt mierzący upływający czas w nanosekundach. Jest to przydatne w przypadku
mierzyć czas, który upłynął, używając tej klasy zamiast bezpośrednich wywołań funkcji
System.nanoTime ()
z kilku powodów:
  • Alternatywne źródło czasu może zostać wymienione w celach testowych lub wydajnościowych.
  • Jak udokumentowano w nanoTime, zwracana wartość nie jest bezwzględna i może być interpretowana tylko jako odniesienie do innego znacznika czasu zwrócone przez nanoTime w innym czasie. Stoper to więcej efektywna abstrakcja, ponieważ ujawnia tylko te względne wartości, ale nie absolutne.
Stopwatch stopwatch = Stopwatch.createStarted();
doSomething();
stopwatch.stop();// optionallong millis = stopWatch.elapsed(TimeUnit.MILLISECONDS);log.info("that took: " + stopwatch);// formatted string like "12.3 ms"
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Teraz możesz spróbować czegoś takiego:
Instant starts = Instant.now();
Thread.sleep(10);
Instant ends = Instant.now();
System.out.println(Duration.between(starts, ends));

Dane wyjściowe są zgodne z ISO 8601.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Spring udostępnia elegancką klasę
org.springframework.util.StopWatch
(moduł spring-core).
StopWatch stopWatch = new StopWatch();
stopWatch.start();
// Do something
stopWatch.stop();
System.out.println(stopWatch.getTotalTimeMillis());
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Kod nie działa, ponieważ zmienna przeszła w getElapsedTimeSecs () nie jest zmiennoprzecinkowa/double.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Użyj
System.currentTimeMillis ()
, aby uzyskać czas rozpoczęcia i czas zakończenia oraz obliczyć różnicę.
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);
}
}

Więcej szczegółów w tym przewodniku
http://www.vogella.com/article ... .html
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Nie ma wbudowanego stopera, ale od JSR-310 (Java 8 razy) możesz to zrobić po prostu.
ZonedDateTime now = ZonedDateTime.now();
// Do stuff
long seconds = now.until(ZonedDateTime.now(), ChronoUnit.SECONDS);

Nie przeprowadziłem tego poprawnie testu porównawczego, ale sugerowałbym, że użycie stopera z guawy jest bardziej wydajne.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Spróbuj

http://introcs.cs.princeton.ed ... .html
http://introcs.cs.princeton.ed ... .html
to jest bardzo proste
Stopwatch st = new Stopwatch();
// Do smth. here
double time = st.elapsedTime();// the result in millis

Ta klasa jest częścią stdlib.jar
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

użycie: com.google.common.base.Stopwatch, jego proste i łatwe.
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>23.0</version>
</dependency>

próba:
Stopwatch stopwatch = new Stopwatch();
stopwatch.start();"Do something"logger.debug("this task took " + stopwatch.stop().elapsedTime(TimeUnit.MILLISECONDS) + " mills");

zadanie to zajęło 112 młynów
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Prosty stoper klasy podstawowej:
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 = resu<
} 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;
}
}

Za pomocą:
StopWatch sw = new StopWatch();
sw.start();
// doWork()
sw.stop();
System.out.println( sw.getElapsedTime().toMillis() + "ms");
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Spróbuj tego
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();
}
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Spróbuj tego:
/*
* 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));
}}

Posługiwać się:
StopWatch sw = new StopWatch();...
sw.startTiming();...
String interval = sw.stopTiming();
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Spróbuj tego.
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;
}
}

Za pomocą:
StopWatch watch = new StopWatch();
// do something
watch.stop();

Konsola:
StopWatch: 143 milliseconds.
StopWatch: 0.143 seconds.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:


Performetrics

zapewnia poręczną klasę stopera, dokładnie taką, jakiej potrzebujesz. Może mierzyć czas zegara ściennego i nie tylko: mierzy również czas procesora (czas użytkownika i czas systemowy), jeśli trzeba.
Jest mały, darmowy i możesz go pobrać z Maven Central.
Więcej informacji i przykładów można znaleźć tutaj:

https://obvj.net/performetrics
https://obvj.net/performetrics
Stopwatch sw = new Stopwatch();
sw.start();// Your codesw.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 |
// +-----------------+----------------------+--------------+

Możesz konwertować metryki na dowolną jednostkę czasu (nanosekundy, milisekundy, sekundy itp.)
PS: Jestem autorem tego narzędzia.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Tutaj znajdziesz wygodną opcję:
https://github.com/varra4u/uti ... .java
https://github.com/varra4u/uti ... .java
Za pomocą:
final StopWatch timer = new StopWatch();
System.out.println("Timer: " + timer);
System.out.println("ElapsedTime: " + timer.getElapsedTime());
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Spróbuj tego.
Całkowicie działające rozwiązanie Java Stopwatch
https://coderichjava.blogspot. ... .html
Otrzymasz tutaj w pełni działające rozwiązanie.
Tylko fragment powyższego rozwiązania:
Możesz utworzyć klasę podobną do poniższego kodu i użyć tej metody do uruchamiania i zatrzymywania klasy przed i po sekcji kodu, dla której chcesz zmierzyć upływ czasu.
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.";
}

}
Podziękować.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się