Java Methode Zeit messen?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet
wie lang der Compiler in etwa braucht zum ausführen.

Der normale Compiler führt gar nichts aus, der setzt den Code in Java Bytecode um, die die JVM lesen kann und dann dementsprechend handelt.

Mal folgenden Rat: Wenn du es jetzt nicht so genau brauchst (Wobei genau hier bei ,,nano" eher ein seltsames Wort ist!), dann nutz doch System.currentTimeMillis(), das gibt dir die Systemzeit in Millisekunden (01.01.1970 ist der Beginn dieser Zeitzählung, das ist nicht wichtig für dich)

Dein Ansatz ist ja schon mal Gold richtig, bzw. Gold richtig kopiert, wie du das einbaust, ist dir überlassen. Es gibt sämtliche Ansätze, statt myCall kannst du deine Methode hinschreiben oder du integrierst es in deine Methode, wie auch immer, dir fällt sicherlich was ein.

Beispiel Methode 2:

public boolean ueberweisen(GiroKonto zielKonto, double betrag) {
  if(!abheben(betrag))
    return false;

  long startTime = System.currentTimeMillis();

  zielKonto.einzahlen(betrag);

  long now = System.currentTimeMillis();
  System.out.println("Es sind " + (now - startTime) + "ms vergangen.");
  return true;
     }

alfredo153  31.01.2021, 21:20

Deine Messung eines einzigen(!) Methodenaufrufs wird wahrscheinlich nichtmal die Granularität von currentTimeMillis() überschreiten. Was hier rauskommt, sind reine Hausnummern.

0
der Compiler in etwa braucht zum ausführen.

Microbenchmarks dieser Art sind in den meisten Fällen nicht aussagekräftig, umso mehr bei einer Trivialmethode wie jener, die du hier messen willst. (Wenn du hier ernsthaft rausfinden willst ob 1-2 Methodenaufrufe einen Unterschied machen, vergiss es. Tun sie nicht.)

In der Regel verwendet man dafür sowas wie JMH. Der Ansatz mit nanoTime() ist aber für eine schnelle Überschlagsmessung okay - was ist denn unklar? Statt myCall() wären eben deine Methoden aufzurufen.

Zumindest aber sollte man die jeweilige Methode nicht nur einmal, sondern in einer Schleife sehr viele Male ausführen, sodass die Gesamtmessung mindestens ein paar Sekunden dauert, und die ersten Wiederholungen ignorieren, um der JVM (genauer: dem JIT-Compiler) Zeit zum Aufwärmen zu geben.

Ich würde mir eine Klasse einbauen mit Startzeit und Stoppzeit und eine Instanz der Klasse als Membervariable, um sowohl die Zeit für die Verarbeitung von Teilabschnitten als auch ganzen Prozessen messen zu können.

So ein Objekt könntest du dir überlegen, mit dem Start der Anwendung gleich zu erzeugen, da du das Stoppen der Zeit theoretisch überall gebrauchen könntest, ähnlich wie ein Log-Objekt.

Oder du verbindest gleich das Log-Objekt mit der Zeitnahme-Klasse.

Bedenke aber, dass jede Messung stets einen Eingriff ins System bedeutet. Das bedeutet, du kannst nicht so einfach messen, wie lange ein Prozess dauert, weil die Zeitmessung selbst Zeit in Anspruch nimmt. Du müsstest also die Zeit der Zeitmessung herausnehmen, die du aber nicht kennst, weil du sie nicht misst. Misst du sie, dann verbraucht das wiederum Zeit.

Du müsstest schon fast per Hand ausrechnen, wie viel Zeit die Zeitmessung anhand der Operationen verbraucht. Oder du nimmst die Zeitmessung x mal vor und rechnest dann transitiv über Eck aus, was eine Zeitmessung benötigt.

Woher ich das weiß:Studium / Ausbildung – Fachinformatiker - Anwendungsentwicklung