Warum ist Timer schneller als While?

ruerob

Mitglied
Ich begrüße euch mit einem freundlichen Hallo.

Ich stehe vor folgendem Rätsel:

Wenn ich eine Methode sehr oft hintereinander ausführen möchte und das über eine While-Schleife tue, habe ich weniger Schleifendurchläufe pro Sekunde, als wenn ich das gleiche über einen Timer.scheduleAtFixedRate(new Timertask(),3,3); tue.

Warum ist das so? Ich schreibe mal die zwei Varianten auf:

Hier nun zuerst die langsamere Variante
Java:
public void init(){
  Timer timer = new Timer();
  timer.schedule(new TimerTask(){public void run(){loop();}}, 3);
}

public void loop(){
  while(true)
    run();
}

und jetzt die schnellere Variante
Java:
public void init(){
  Timer timer = new Timer();
  timer.scheduleAtFixedRate(new TimerTask() { public void run() {loop();}},3,3);
}

public void loop(){
    run();
}

Ich hab es mit der neusten Java VM probiert.
Meine Entwicklungsumgebung ist Eclipse,
und als Betriebssystem nutze ich Windows XP Home SP2.
 

ruerob

Mitglied
Danke für die schnelle Antwort.

Nein in meinem Rechner hab ich nur ne CPU mit einem Kern.
Nämlich den AMD Athlon 64 3800+ mit 2.39 GHz.
Ich habs auch auf einem Netbook mit Intel Atom Prozessor getestet, war aber genau das gleiche.

Ich starte in der Schleife ein repaint. Wenn ich das mit der Whileschleife tue, komme ich auf maximal 160 Bilder pro Sekunde, wenn ich nur die Bilderzahl ausrechnen und anzeigen lasse. Mit dem Timer erreiche ich allerdings maximal 289 Bilder pro Sekunde.

Da der Unterschied so groß ist, frage ich mich da, was macht der Timer so anders?

EDIT: Selbst wenn ich die Methode loop() als synchronized kennzeichne komme ich mit dem Timer auf die höheren Werte.
 
Zuletzt bearbeitet:

ruerob

Mitglied
Wiedermal danke für die schnelle Antwort.

Wenn ich
Java:
timer.scheduleAtFixedRate(new TimerTask() { public void run() {loop();}},3,3);

in

Java:
timer.schedule(new TimerTask(){public void run(){loop();}},3,3);

änder, bekomme ich konstante 65 Bilder pro Sekunde angezeigt.

Selbst wenn ich noch "ein paar Berechnungen" pro Bild hinzufüge, bleibt er bei diesem Wert.
Nutze ich scheduleAtFixedRate habe ich 289 Bilder pro Sekunde. Wenn ich da einen Softwarerenderer mit in der Schleife laufen lasse, habe ich nur noch 160 Bilder.
Wenn ich aber schedule benutze, bleibt der Wert mit und ohne Renderer bei 65 Bildern pro Sekunde.

Alles seltsam...
 
Zuletzt bearbeitet:

ThreadPool

Bekanntes Mitglied
Morgäääähn,

das "schedule()" eher "konstant" läuft im Vergleich zu scheduleAtFixedRate() ist mit ein paar Sätzen hier: Timer (Java Platform SE 6) erklärt.

Die Differenz zwischen while und dem Thread kann ich dir nicht erklären, dazu fehlt einfach der ganze Code. Aber auch auf Einkern-Prozessoren kann es etwas bringen Multithreading zu verwenden, das Betriebssystem hat ja diverse Möglichkeiten zur Verwaltung und Ausführung etc. pp. Kann gut sein das es einfach daran liegt. :)
 

TR

Aktives Mitglied
Galileo Computing :: Java ist auch eine Insel – 14.7 Zeitgesteuerte Abläufe

Die schedule()-Methode gibt es in vier Ausführungen. Dazu kommen zwei Methoden scheduleAtFixedRate(), die versuchen, die Genauigkeit zu verbessern. Dies lohnt sich bei Operationen, die über einen langen Zeitraum präziser ohne Drift ausgeführt werden sollen, wie es etwa bei einer Uhr gilt, die jede Stunde ihren großen Zeiger bewegt. Selbst wenn Hintergrundoperationen, wie Garbage-Collection, die pünktliche Ausführung der Operation verhindern, wird die Verspätung bis zur nächsten Wiederholung aufgeholt.
 

fastjack

Top Contributor
Also bei mir schafft die "schnellere Variante" wesentlich weniger. Das liegt daran, das sie die run() Methode (nicht die anonyme!) wesentlich weniger aufruft als die "langsamere" Variante, die durch "while(true) run();" ja ein Dauerfeuer produziert. Bei mir schaffe ich mit der "schelleren" Variante gerade mal 1000 Aufrufe in einer Sekunde, während die andere Variante 100000000 in einer Sekunde macht.
Ich denke der Geschwindigkeitsunterschied kommt daher, das die run()-Methode sehr rechenintensiv ist und ein "Dauerfeuer" an dieser Stelle eher schadhaft ist, als sozusagen "kontrollierte" Aufrufe.
 
Zuletzt bearbeitet:

fastjack

Top Contributor
Nochmal einfacher:

in der ersten Variante wird alle drei Sekunden ein wahres Dauerfeuer fabriziert (while(true) run();), in der zweiten wird alle drei Sekunden einmal run() aufgerufen.
 

ruerob

Mitglied
Das mit dem "Dauerfeuer" war die Lösung. Wenn ich in die Whileschleife ein Thread.sleep(1) einbaue bekomme ich einen Maximalwert von 520 Bildern pro Sekunde. Allerdings bekomme ich mit zugeschaltetem Softwarerenderer jetzt maximal nur noch 120 Bilder in der Sekunde.

So sieht die neue Variante aus:
Java:
public void loop() {
	while(true){
		repaint();
		try {
			Thread.sleep(1);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

EDIT: Das ich nur noch 120 Bilder pro Sekunde bekomme, liegt dann wohl aber an der Milisekunde, die der Thread nach jedem Schleifendurchlauf wartet.

Dann ist ja alles geklärt.

Vielen Dank an alle die mir hier geholfen haben.

Ruerob
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Schneller Timer Java Basics - Anfänger-Themen 2
S Timer vs ExecutorService: jeden Sonntag um 14.00 Uhr einen Task starten..? Java Basics - Anfänger-Themen 1
_user_q Timer - ScheduledExecutorService wird schon vorher beendet Java Basics - Anfänger-Themen 5
E multiple Timer die sich nicht summieren Java Basics - Anfänger-Themen 12
Jan_x8 Timer/Scanner Java Basics - Anfänger-Themen 5
C Timer aktualisieren Java Basics - Anfänger-Themen 5
L GUI- wie cancel ich einen Timer? Java Basics - Anfänger-Themen 10
missy72 Timer oder Timeline Java Basics - Anfänger-Themen 3
R Timer Format: 00:00:00 Java Basics - Anfänger-Themen 29
C java.util Timer läuft zu langsam? Java Basics - Anfänger-Themen 1
D Änder der Timer Speeds Java Basics - Anfänger-Themen 1
E Timer trotz erwartender Eingabe durchlaufen lassen Java Basics - Anfänger-Themen 11
L Methoden Timer Java Basics - Anfänger-Themen 9
J Memory-Spiel Aktivierung der Methode mit Timer Java Basics - Anfänger-Themen 44
G Animation Timer Nano Time Java Basics - Anfänger-Themen 2
S Timer reseten Java Basics - Anfänger-Themen 3
T Timer stoppt zu früh Java Basics - Anfänger-Themen 7
CptK Methoden Timer & Mathematischer Denkfehler Java Basics - Anfänger-Themen 7
mobaer Swing Timer stoppen Java Basics - Anfänger-Themen 3
C Wie erstellt man einen Timer/Delay? Java Basics - Anfänger-Themen 1
J Timer bauen, Main Methode immer wieder neu starten Java Basics - Anfänger-Themen 13
D Timer programmieren Java Basics - Anfänger-Themen 13
N Timer funktioniert nicht beim starten Java Basics - Anfänger-Themen 3
B Timer mehrere Male ausführen Java Basics - Anfänger-Themen 4
J Timer richtig pausieren Java Basics - Anfänger-Themen 2
E Timer erstellen Java Basics - Anfänger-Themen 2
B javax.ejb.Timer wieder starten? Java Basics - Anfänger-Themen 0
S actionlistener timer Java Basics - Anfänger-Themen 9
C Wie kann ich jetzt von der Game.java auf die Timer.java zugreifen? Java Basics - Anfänger-Themen 6
S timer mit imagedatei Java Basics - Anfänger-Themen 5
S timer Java Basics - Anfänger-Themen 0
V Java Uitil Timer Stoppt nicht Java Basics - Anfänger-Themen 2
KaffeeFan Timer beenden Java Basics - Anfänger-Themen 12
K Ampelsteuerung mit Timer Java Basics - Anfänger-Themen 8
F Array und Timer Java Basics - Anfänger-Themen 2
G Timer einsetzen Java Basics - Anfänger-Themen 2
J Timer oder Thread programmieren ? Java Basics - Anfänger-Themen 10
F Timer beendet nicht immer Java Basics - Anfänger-Themen 2
F Timer abbrechen und wieder starten Java Basics - Anfänger-Themen 5
U Java Swing Timer mit ButtonKlick starten u. nach 12 Sekunden Befehl ausführen Java Basics - Anfänger-Themen 7
W Erste Schritte Timer soll jede Sekunde Label aktualisieren Java Basics - Anfänger-Themen 5
T Timer - HILFE Java Basics - Anfänger-Themen 10
O Alternative zum swing-Timer Java Basics - Anfänger-Themen 5
A Wieso funktioniert dieser Timer nicht?? Java Basics - Anfänger-Themen 3
S timer funktion mit javax panel Java Basics - Anfänger-Themen 3
O Laufender Timer+Action Listener in Thread VS isAlive() Java Basics - Anfänger-Themen 4
O Starte Timer, während anderer Timer noch läuft. Ruft dies Schwierigkeiten hervor? Java Basics - Anfänger-Themen 0
C Timer aus anderer Klasse stoppen/starten Java Basics - Anfänger-Themen 3
B Timer beenden? Java Basics - Anfänger-Themen 0
G Erste Schritte Timer: In einem festgelegten Intervall eine Methode ausführen Java Basics - Anfänger-Themen 6
O Delayed Timer erstellen Java Basics - Anfänger-Themen 3
M Timer / Thread Java Basics - Anfänger-Themen 43
M Javax.swing - Timer(2 Button) Java Basics - Anfänger-Themen 17
J Timer - Swing Java Basics - Anfänger-Themen 5
A Timer: textarea.getText() mit Variable vergleichen Java Basics - Anfänger-Themen 3
D Problem mit Methode und Timer Java Basics - Anfänger-Themen 35
T Wie mache ich einen Timer der alle 2 sekunden aufgerufen wird? Java Basics - Anfänger-Themen 5
R Einfacher Timer geht nicht Java Basics - Anfänger-Themen 7
J Swing Timer Java Basics - Anfänger-Themen 3
M Einfacher Timer ;) Java Basics - Anfänger-Themen 15
M Timer für Termial-Eingaben Java Basics - Anfänger-Themen 3
C Methoden Einen Timer einbauen, aber wie? Java Basics - Anfänger-Themen 5
B Timer Java Basics - Anfänger-Themen 25
M Timer-Thread in Swing öffnet jedes Mal ein neues Fenster Java Basics - Anfänger-Themen 6
S Timer / Schleifen Verständnis Problem Java Basics - Anfänger-Themen 3
S Erste Schritte Java Timer Java Basics - Anfänger-Themen 13
E Threads Timer Java Basics - Anfänger-Themen 6
Spin KI Anfänger Frage : Timer Problem Java Basics - Anfänger-Themen 6
F Prüfen ob timer läuft Java Basics - Anfänger-Themen 6
L Erste Schritte Timer und Zugriffsattribute Java Basics - Anfänger-Themen 5
M Audio + Timer Java Basics - Anfänger-Themen 12
M Methoden Timer in ActionListener aufrufen Java Basics - Anfänger-Themen 2
R Klassen MemorySpiel: brauche Timer Java Basics - Anfänger-Themen 3
D Timer in Applet Java Basics - Anfänger-Themen 2
F Java Timer Frage Java Basics - Anfänger-Themen 14
VfL_Freak Verständnisfrage zur Klasse "TIMER" Java Basics - Anfänger-Themen 7
B Timer Java Basics - Anfänger-Themen 2
S timer task problem Java Basics - Anfänger-Themen 2
C Überprüfen, ob Timer läuft Java Basics - Anfänger-Themen 3
S "Kleines" Problem mit dem Timer Java Basics - Anfänger-Themen 4
Luk10 Problem mit vielen Timer(-Events) Java Basics - Anfänger-Themen 17
Luk10 Swing timer und Threads Java Basics - Anfänger-Themen 4
W Timer erstellen Java Basics - Anfänger-Themen 2
M Timer: period während Verlauf wechseln Java Basics - Anfänger-Themen 12
M Timer unterbrechen? Wo ist mein Thread? Java Basics - Anfänger-Themen 2
L Timer innerhalb eines Threads Java Basics - Anfänger-Themen 3
P Java Timer Java Basics - Anfänger-Themen 2
C countdown/timer/Zeit warten lassen Java Basics - Anfänger-Themen 14
B problem mit timer/timertask, Farbverlauf Java Basics - Anfänger-Themen 10
Piwi Timer bei Programmende beenden Java Basics - Anfänger-Themen 25
T zweiter Timer überschreibt den ersten Timer ? Java Basics - Anfänger-Themen 5
kulturfenster Problem mit javax.swing.Timer Java Basics - Anfänger-Themen 2
C Regelmäßigen Timer bei Zeitüberschreitung nacheinander abarbeiten Java Basics - Anfänger-Themen 2
J timer Java Basics - Anfänger-Themen 2
J timer Java Basics - Anfänger-Themen 2
H Timer Java Basics - Anfänger-Themen 3
dl85hej Zeitsitschleife anstatt Timer Java Basics - Anfänger-Themen 5
G Klasse mit Timer nicht beenden Java Basics - Anfänger-Themen 6
S Timer / TimerTask Frage Java Basics - Anfänger-Themen 8
S Timer bzw. TimerTask Frage Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben