Wie terminiere ich die Ausführung einer Methode in Java?

Lesezeit: 7 Minuten

Wie terminiere ich die Ausfuhrung einer Methode in Java
Oger Psalm33

  1. Wie erhalte ich die Ausführungszeit einer Methode?
  2. Gibt es eine Timer Utility-Klasse für Dinge wie das Timing, wie lange eine Aufgabe dauert usw.?

Die meisten Suchanfragen bei Google geben Ergebnisse für Timer zurück, die Threads und Aufgaben planen, was ich nicht möchte.

  • Die JAMon-API ist eine kostenlose, einfache, leistungsstarke, Thread-sichere Java-API, mit der Entwickler die Leistung und Skalierbarkeit von Produktionsanwendungen einfach überwachen können. JAMon verfolgt Hits, Ausführungszeiten (gesamt, durchschnittlich, min, max, std dev) und mehr. http://jamonapi.sourceforge.net/ herunterladen : http://sourceforge.net/project/showfiles.php?group_id=96550

    – Mike Pone

    7. Oktober 2008 um 21:47 Uhr

  • Vielleicht möchten Sie sich auch die ansehen Apache Commons Lang Stoppuhr Klasse. Eine einfache, aber nützliche Utility-Klasse.

    Benutzer101561

    5. Mai 2009 um 13:10 Uhr


  • Später ähnliche Frage: Wie schreibe ich einen korrekten Micro-Benchmark in Java?

    – Basilikum Bourque

    1. Juli 2016 um 22:48 Uhr

  • Ja, StopWatch ist dafür großartig.

    – Shubham Pandey

    1. August 2019 um 6:08 Uhr

  • Java 8 verwenden Instant Klasse: stackoverflow.com/a/30975902/1216775

    – akhil_mittal

    1. August 2019 um 11:36 Uhr

Ich gehe mit der einfachen Antwort. Funktioniert bei mir.

long startTime = System.currentTimeMillis();

doReallyLongThing();

long endTime = System.currentTimeMillis();

System.out.println("That took " + (endTime - startTime) + " milliseconds");

Es funktioniert ganz gut. Die Auflösung ist offensichtlich nur auf die Millisekunde genau, das können Sie mit System.nanoTime() besser machen. Es gibt einige Einschränkungen für beide (Betriebssystem-Scheduler-Slices usw.), aber das funktioniert ziemlich gut.

Durchschnitt über ein paar Läufe (je mehr desto besser) und Sie bekommen eine anständige Vorstellung.

  • Tatsächlich ist System.currentTimeMillis() nur über 15 ms genau. Bei wirklich niedrigen Werten ist dem nicht zu trauen. Die Lösung dafür ist (wie erwähnt) System.nanoTime();

    – Steve g

    7. Oktober 2008 um 21:38 Uhr

  • Ok, ich wollte dies gerade als offizielle Antwort akzeptieren, bis ich Steve gs Kommentar las. Toller Leckerbissen, Steve!

    – Oger Psalm33

    8. Oktober 2008 um 12:15 Uhr

  • nanoTime() garantiert keine bessere Genauigkeit als currentTimeMillis, aber viele JVM-Implementierungen haben eine bessere Genauigkeit mit nanoTime.

    – James Schek

    8. Oktober 2008 um 17:22 Uhr

  • @JamesSchek Sie müssen wirklich auf Ihre Formulierung achten, wie ich bereits an anderer Stelle zu diesem identischen Kommentar erwähnt habe. nanoTime ist es garantiert mindestens so entschlossen als currentTimeMillis. docs.oracle.com/javase/7/docs/api/java/lang/…

    – b1nary.atr0phy

    18. Mai 2013 um 15:37 Uhr


  • Der einzige kleine Vorteil von currentTimeMillis ist, dass es sich um einen tatsächlichen Zeitstempel handelt, der auch zum Protokollieren von Start- und Endzeiten verwendet werden kann, während nanoTime “kann nur zur Messung der verstrichenen Zeit verwendet werden und steht in keinem Zusammenhang mit einem anderen Begriff der System- oder Wanduhrzeit.”

    – Brad Parks

    28. November 2016 um 14:17 Uhr

  • Leider ist Guava’s Stopwatch nicht Thread-sicher. Ich habe das auf die harte Tour gelernt.

    – Dexter Legaspi

    15. Dezember 2014 um 14:50 Uhr

  • @DexterLegaspi Wäre sehr an euren Erfahrungen interessiert! Möchtest du teilen?

    – Siddhartha

    19. Januar 2015 um 19:30 Uhr

  • Die parallele Verwendung der Stoppuhr würde dazu führen, dass Sie anrufen start() mehrmals hintereinander (das gleiche für stop()).

    – Mingwei Samuel

    16. August 2019 um 17:36 Uhr

Wie terminiere ich die Ausfuhrung einer Methode in Java
Sufiyan Ghori

Verwenden Sofortig und Dauer aus der neuen API von Java 8,

Instant start = Instant.now();
Thread.sleep(5000);
Instant end = Instant.now();
System.out.println(Duration.between(start, end));

Ausgänge,

PT5S

  • Danke, wie kann ich das Ergebnis ausgeben, ohne den PT davor zu haben?

    – java123999

    16. März 2016 um 15:31 Uhr

  • Das Problem mit der Methode ist, dass Instant keine Probleme mit der Genauigkeit von Milli- und Nanosekunden hat. Ref: stackoverflow.com/questions/20689055/…

    – prashantsunkari

    12. April 2017 um 22:56 Uhr

  • @java123999: Du kannst anrufen Duration.between(start, end).getSeconds(). Duration hat auch Methoden zum Umrechnen in andere Zeiteinheiten, z toMillis() was in Millisekunden umgerechnet wird.

    – Emil Lunde

    29. Mai 2018 um 13:29 Uhr


Alle möglichen Wege an einem Ort versammelt.

Datum

Date startDate = Calendar.getInstance().getTime();
long d_StartTime = new Date().getTime();
Thread.sleep(1000 * 4);
Date endDate = Calendar.getInstance().getTime();
long d_endTime = new Date().getTime();
System.out.format("StartDate : %s, EndDate : %s \n", startDate, endDate);
System.out.format("Milli = %s, ( D_Start : %s, D_End : %s ) \n", (d_endTime - d_StartTime),d_StartTime, d_endTime);

System.aktuelleZeitMillis()

long startTime = System.currentTimeMillis();
Thread.sleep(1000 * 4);
long endTime = System.currentTimeMillis();
long duration = (endTime - startTime);  
System.out.format("Milli = %s, ( S_Start : %s, S_End : %s ) \n", duration, startTime, endTime );
System.out.println("Human-Readable format : "+millisToShortDHMS( duration ) );

Für Menschen lesbar Format

public static String millisToShortDHMS(long duration) {
    String res = "";    // java.util.concurrent.TimeUnit;
    long days       = TimeUnit.MILLISECONDS.toDays(duration);
    long hours      = TimeUnit.MILLISECONDS.toHours(duration) -
                      TimeUnit.DAYS.toHours(TimeUnit.MILLISECONDS.toDays(duration));
    long minutes    = TimeUnit.MILLISECONDS.toMinutes(duration) -
                      TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(duration));
    long seconds    = TimeUnit.MILLISECONDS.toSeconds(duration) -
                      TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(duration));
    long millis     = TimeUnit.MILLISECONDS.toMillis(duration) - 
                      TimeUnit.SECONDS.toMillis(TimeUnit.MILLISECONDS.toSeconds(duration));

    if (days == 0)      res = String.format("%02d:%02d:%02d.%04d", hours, minutes, seconds, millis);
    else                res = String.format("%dd %02d:%02d:%02d.%04d", days, hours, minutes, seconds, millis);
    return res;
}

Guave: Google StoppuhrKRUG « Ein Ziel von Stopwatch ist es, die verstrichene Zeit in Nanosekunden zu messen.

com.google.common.base.Stopwatch g_SW = Stopwatch.createUnstarted();
g_SW.start();
Thread.sleep(1000 * 4);
g_SW.stop();
System.out.println("Google StopWatch  : "+g_SW);

Apache Commons LangKRUG

« Stoppuhr

bietet eine bequeme API für Timings.

org.apache.commons.lang3.time.StopWatch sw = new StopWatch();
sw.start();     
Thread.sleep(1000 * 4);     
sw.stop();
System.out.println("Apache StopWatch  : "+ millisToShortDHMS(sw.getTime()) );

JODA-ZEIT

public static void jodaTime() throws InterruptedException, ParseException{
    java.text.SimpleDateFormat ms_SDF = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");
    String start = ms_SDF.format( new Date() ); // java.util.Date

    Thread.sleep(10000);

    String end = ms_SDF.format( new Date() );       
    System.out.println("Start:"+start+"\t Stop:"+end);

    Date date_1 = ms_SDF.parse(start);
    Date date_2 = ms_SDF.parse(end);        
    Interval interval = new org.joda.time.Interval( date_1.getTime(), date_2.getTime() );
    Period period = interval.toPeriod(); //org.joda.time.Period

    System.out.format("%dY/%dM/%dD, %02d:%02d:%02d.%04d \n", 
        period.getYears(), period.getMonths(), period.getDays(),
        period.getHours(), period.getMinutes(), period.getSeconds(), period.getMillis());
}

Java-Datumszeit-API von Java 8 ” EIN Dauer Objekt repräsentiert einen Zeitraum zwischen zwei Sofortig Objekte.

Instant start = java.time.Instant.now();
    Thread.sleep(1000);
Instant end = java.time.Instant.now();
Duration between = java.time.Duration.between(start, end);
System.out.println( between ); // PT1.001S
System.out.format("%dD, %02d:%02d:%02d.%04d \n", between.toDays(),
        between.toHours(), between.toMinutes(), between.getSeconds(), between.toMillis()); // 0D, 00:00:01.1001 

Frühlingsrahmen bietet Stoppuhr Hilfsklasse zum Messen der verstrichenen Zeit in Java.

StopWatch sw = new org.springframework.util.StopWatch();
sw.start("Method-1"); // Start a named task
    Thread.sleep(500);
sw.stop();

sw.start("Method-2");
    Thread.sleep(300);
sw.stop();

sw.start("Method-3");
    Thread.sleep(200);
sw.stop();

System.out.println("Total time in milliseconds for all tasks :\n"+sw.getTotalTimeMillis());
System.out.println("Table describing all tasks performed :\n"+sw.prettyPrint());

System.out.format("Time taken by the last task : [%s]:[%d]", 
        sw.getLastTaskName(),sw.getLastTaskTimeMillis());

System.out.println("\n Array of the data for tasks performed « Task Name: Time Taken");
TaskInfo[] listofTasks = sw.getTaskInfo();
for (TaskInfo task : listofTasks) {
    System.out.format("[%s]:[%d]\n", 
            task.getTaskName(), task.getTimeMillis());
}

Ausgang:

Total time in milliseconds for all tasks :
999
Table describing all tasks performed :
StopWatch '': running time (millis) = 999
-----------------------------------------
ms     %     Task name
-----------------------------------------
00500  050%  Method-1
00299  030%  Method-2
00200  020%  Method-3

Time taken by the last task : [Method-3]:[200]
 Array of the data for tasks performed « Task Name: Time Taken
[Method-1]:[500]
[Method-2]:[299]
[Method-3]:[200]

  • Danke, wie kann ich das Ergebnis ausgeben, ohne den PT davor zu haben?

    – java123999

    16. März 2016 um 15:31 Uhr

  • Das Problem mit der Methode ist, dass Instant keine Probleme mit der Genauigkeit von Milli- und Nanosekunden hat. Ref: stackoverflow.com/questions/20689055/…

    – prashantsunkari

    12. April 2017 um 22:56 Uhr

  • @java123999: Du kannst anrufen Duration.between(start, end).getSeconds(). Duration hat auch Methoden zum Umrechnen in andere Zeiteinheiten, z toMillis() was in Millisekunden umgerechnet wird.

    – Emil Lunde

    29. Mai 2018 um 13:29 Uhr


Verwenden Sie einen Profiler (JProfiler, Netbeans Profiler, Visual VM, Eclipse Profiler usw.). Sie erhalten die genauesten Ergebnisse und sind am wenigsten aufdringlich. Sie verwenden den integrierten JVM-Mechanismus für die Profilerstellung, der Ihnen bei Bedarf auch zusätzliche Informationen wie Stack-Traces, Ausführungspfade und umfassendere Ergebnisse liefern kann.

Wenn Sie einen vollständig integrierten Profiler verwenden, ist es ziemlich trivial, eine Methode zu profilieren. Rechtsklick, Profiler -> Zu Root-Methoden hinzufügen. Führen Sie dann den Profiler genauso aus wie einen Testlauf oder Debugger.

  • Dies war auch ein großartiger Vorschlag und einer dieser “duh” Aha-Momente für mich, als ich diese Antwort las. Unser Projekt verwendet JDeveloper, aber ich habe überprüft, und tatsächlich, es hat einen integrierten Profiler!

    – Oger Psalm33

    8. Oktober 2008 um 12:14 Uhr

  • Von Java 7 Build 40 (glaube ich) haben sie den ehemaligen JRockits Flight Recorder in Java aufgenommen (Suche nach Java Mission Control)

    – Niels Bech-Nielsen

    17. März 2014 um 13:30 Uhr

  • Sicher genug @NielsBechNielsen! oracle.com/technetwork/java/javaseproducts/mission-control/…

    – Oger Psalm33

    7. Juli 2014 um 14:43 Uhr

  • Wie bekomme ich zum Beispiel die Ausführung von Methoden in Java von Visual VM?

    – Petert

    13. November 2014 um 8:06 Uhr

964790cookie-checkWie terminiere ich die Ausführung einer Methode in Java?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy