Performanceverbesserung bei Zeitmessung

Hallo, ich arbeite mich grade etwas in die Zeitmessung ein, aber meine bisherige Variante mit der Systemzeit und einer while-Schleife sind extrem arbeitsintensiv für den Prozessor. Gibt es da eine effizientere Variante?

Code:
public class Main {
   
    public static void main(String[] args) {
   
    System.out.println(System.currentTimeMillis());
   
    final long Zeit1 = (System.currentTimeMillis());
    long FinaleZeit, Zeit2 = 1;
   
    while(Zeit2 <(Zeit1+10001)) { //Es soll eine Zeit von 10s gemessen werden
       
        Zeit2 = (System.currentTimeMillis());
       
    }
   
   
   
    FinaleZeit = (Zeit2 - Zeit1)/1000;
   
    System.out.println("Der Zeitunterschied ist "+FinaleZeit+ " Sekunden.");
   
    }

}
 

httpdigest

Top Contributor
Aktuell sieht es so aus als möchtest du für eine gegebene Zeitspanne warten.
In diesem Fall hilft dir z.B. auch Thread.sleep(milliseconds, nanoseconds). Sowohl Thread.sleep() als auch System.currentTimeMillis() sind jedoch relativ ungenau, haben also eine schlechte Auflösung von einigen Millisekunden.
Abhilfe schafft zum Messen zumindest schonmal System.nanoTime(), welches einen hochauflösenden Zeitgeber verwendet, aber nur für delta-Messungen (das was du machst) und nicht für wall-clock-time Messungen geeignet ist.
Du hast also zwei Mechanismen zur Hand:
- System.nanoTime() zum sehr genauen Messen von Zeitdifferenzen
- Thread.sleep() zum relativ ungenauen Schlafenlegen des aufrufenden Threads, so dass keine CPU Zeit verbraucht wird
Du wirst also eine Mischung aus Thread.sleep(), um sich in groben Schritten der zu wartenden Zeit anzunähern, sowie System.nanoTime(), um die exakt gewartete Zeit auch zu messen, zusammen mit einer feingranularen busy-loop verwenden müssen. Um für sehr geringe aber unkontrollierbare Zeitabstände zu warten und keine CPU-Zeit zu verbrauchen, gibt es noch Thread.yield(). Zusammen mit Thread.sleep(), Thread.yield() und System.nanoTime() und einer busy-loop für die letzten paar Millisekunden kannst du schon sehr genau für eine gegebene Anzahl an Millisekunden ressourcenschonend warten.
 
Super, vielen Dank für die schnelle Antwort. Auf Genauigkeit der Zeit kommt es in meinem Programm nicht an, mir reicht es, wenn die Verzögerung auf die Sekunde genau ist. Thread.sleep() sollte also reichen:)
 
X

Xyz1

Gast
Auch wenn mir digest vielleicht einen komischen Blick zuwerfen wird, darf ich fragen ob Du wiederholt warten möchtest?

Bearbeitung Während 'etwas Sinnvolles' getan wird?
 
Ja, also die Zeitverzögerung soll nachher in einer while-Schleife sein. Das Programm soll alle 10 Sekunden eine Zahl ausgeben, die sich pro Durchlauf um einen bestimmten Wert erhöht. Sorry dass ich nicht früher geantwortet hab, habe deine Antwort erst eben gesehen.
 

mihe7

Top Contributor
@absoluterAnfänger der folgende Code ist nur als kleines Beispiel gedacht. Dabei wird der main-Thread für die jeweils angegebene Zeit schlafen gelegt. Für ganz einfache Aufgaben kann das ausreichend sein. Ansonsten halte Dich an das, was die anderen vorgeschlagen haben.

Java:
public class Test {
    public static void main(String[] args) throws InterruptedException {
        int zaehler = 0;
        int wartezeit = 2; // in Sekunden

        while (zaehler < 5) {
            Thread.sleep(wartezeit * 1000);
            zaehler++;
            System.out.printf("zum %d. mal %d Sekunden gewartet\n",
                    zaehler, wartezeit);
        }
    }
}
 

Ähnliche Java Themen

Neue Themen


Oben